Problem:
すべての数は６１７４に通ず

0 から 9 の数字からなる四桁の数 N に対して以下の操作を行う。

N の桁それぞれの数値を大きい順に並べた結果得た数を L とする

N の桁それぞれの数値を小さい順に並べた結果得た数を S とする

差 L-S を新しい N とする(1回分の操作終了)

新しい N に対して 1. から繰り返す

このとき、全桁が同じ数字(0000, 1111など)である場合を除き、あらゆる四桁の数はいつかは 6174になることが知られている。例えば N = 2012の場合

       1回目 (N = 2012): L = 2210, S = 0122, L-S = 2088

       2回目 (N = 2088): L = 8820, S = 0288, L-S = 8532

       3回目 (N = 8532): L = 8532, S = 2358, L-S = 6174

となり、3 回の操作で 6174 に到達する。

0 から 9 の数字からなる四桁の数が与えられたとき、何回の操作で 6174 に到達するか計算するプログラムを作成して下さい。

入力

入力は複数のデータセットからなる。入力の終わりは 0000 が１つの行で示される。各データセットは以下の形式で与えられる。

N

データセットは１行であり、N (1 ≤ N ≤ 9999) は四桁の数を示す。N < 1000 の場合は上の桁は 0 で埋められている。

データセットの数は 10000 を超えない。

出力

各データセットごとに何回の操作で 6174 に到達したかを１行に出力する。ただし全桁が同じ数字である数が入力として与えられた場合は NA と出力する。

入力例

6174
2012
3333
0000

出力例

0
3
NA

Solution in JAVA (judge verdict: Accepted)

/**
 * All Numbers Lead to 6174
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

import static java.lang.Integer.parseInt;

public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = "";

		while (!(line = br.readLine()).equals("0000")) {

			int N = parseInt(line), L, S;
			int k;
			int c = 0;

			outer:
			while (N != 6174) {

				//N
				byte[] nums = new byte[10];
				k = 1000;
				for (int i = 0; i < 4; i++) {
					int n = N / k;
					if (++nums[n] == 4) {
						c = -1;
						break outer;
					}
					N -= n * k;
					k /= 10;
				}

				//S
				byte[] numsS = Arrays.copyOf(nums, nums.length);
				k = 1000;
				S = 0;
				for (int i = 0; i < 10; i++) {
					while (numsS[i] > 0) {
						S += i * k;
						numsS[i]--;
						k /= 10;
					}
				}

				//L
				byte[] numsL = Arrays.copyOf(nums, nums.length);
				k = 1000;
				L = 0;
				for (int i = 9; i >= 0; i--) {
					while (numsL[i] > 0) {
						L += i * k;
						numsL[i]--;
						k /= 10;
					}
				}

				N = L - S;
				c++;
			}

			//ans.
			System.out.println(c > -1 ? c : "NA");
		}
	}
}