1. 程式人生 > >PAT 乙級 1019. 數字黑洞 (20) Java版

PAT 乙級 1019. 數字黑洞 (20) Java版

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

例如,我們從6767開始,將得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

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

輸入格式:

輸入給出一個(0, 10000)區間內的正整數N。

輸出格式:

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

輸入樣例1:

6767

輸出樣例1:

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174

輸入樣例2:

2222

輸出樣例2:

2222 - 2222 = 0000
import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner in = new Scanner(System.in);
		
		int number = in.nextInt();
		in.close();

		while (true) {
			int d = desc(number);
			int i = incr(number);
			number = i - d;
			if (number == 0) {
				System.out.printf("%04d - %04d = %04d\n", i, d, number);
				break;
			}
			
			if (number == 6174) {
				System.out.printf("%04d - %04d = %04d\n", i, d, number);
				break;
			}
			System.out.printf("%04d - %04d = %04d\n", i, d, number);
		}
	}

	public static int desc(int number) {
		char[] array = String.format("%04d", number).toCharArray();
		Arrays.sort(array);
		int temp = 0;
		for (int i = 0; i < 4; i++) {
			temp = temp * 10 + (array[i] - '0');
		}
		return temp;
	}
	
	public static int incr(int number) {
		char[] array = String.format("%04d", number).toCharArray();
		Arrays.sort(array);
		int temp = 0;
		for (int i = 3; i >= 0; i--) {
			temp = temp * 10 + (array[i] - '0');
		}
		return temp;
	}
}