PAT1019 數字黑洞(java實現)

TNTZS666發表於2019-01-29

題目描述:

給定任一個各位數字不完全相同的 4 位正整數,如果我們先把 4 個數字按非遞增排序,再按非遞減排序,然後用第 1 個數字減第 2 個數字,將得到一個新的數字。一直重複這樣做,我們很快會停在有“數字黑洞”之稱的 6174,這個神奇的數字也叫 Kaprekar 常數。

  • 例如,我們從6767開始,將得到
    7766 - 6677 = 1089
    9810 - 0189 = 9621
    9621 - 1269 = 8352
    8532 - 2358 = 6174
    7641 - 1467 = 6174
    … …

現給定任意 4 位正整數,請編寫程式演示到達黑洞的過程。


  • 輸入格式
    輸入給出一個 (0,10^​4) 區間內的正整數 N。

  • 輸出格式
    如果 N 的 4 位數字全相等,則在一行內輸出 N - N = 0000;否則將計算的每一步在一行內輸出,直到 6174 作為差出現,輸出格式見樣例。注意每個數字按 4 位數格式輸出。


解題思路:這道題要點就是怎麼把輸入的數字排序,這裡java中直接可以呼叫collection的sort方法,之後分別按降序升序兩個for迴圈取出list中的值儲存到s1,s2兩個字串中,然後將字串轉化為整型後相減再所得結果轉化為字元型。最後對於題目給出的一些限制做一些輸出時的判斷即可

易錯點:題目要求每個數字都要以4位格式輸出,所以需要對s的長度進行判斷,如果不是4位在前面加個0


程式:

//題目並沒有AC,得分17分
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main{
public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	String s = sc.next();
	sc.close();
	ArrayList<Character> list = new ArrayList<Character>();
	boolean flag = true;
	while(flag){
	//System.out.println(s);
	char[] c = s.toCharArray();
	list.clear();//初始化list
	String s1 = "";
	String s2 = "";
	for (int i = 0; i < c.length; i++) {
		list.add(c[i]);
	}
	Collections.sort(list);
	for (int i = 0; i < list.size(); i++) {
		s2 += list.get(i);
	}
	for (int i = list.size()-1; i >= 0 ; i--) {
		s1 += list.get(i);
	}
	int r = Integer.parseInt(s1) - Integer.parseInt(s2);
	if (r==0) {
		s = "0000";
		flag = false;
		System.out.println(s1+" - "+s2+" = "+s);
		break;
	}
	s = String.valueOf(r);
	if (s.length()<4) {
		s = "0"+s;
	}
	if (s.equals("6174")) {
		flag = false;
	}
	System.out.println(s1+" - "+s2+" = "+s);
	
}
}
}

相關文章