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 C (judge verdict: Accepted)

#include <stdio.h>
#include <stdlib.h>
int compar(const int *val1,const int *val2){
    if(*val1 < *val2){
        return -1;
    }
    else if(*val1 == *val2){
        return 0;
    }
    else {
        return 1;
    }
}

int compar1(const int *val1,const int *val2){
    if(*val1 > *val2){
        return -1;
    }
    else if(*val1 == *val2){
        return 0;
    }
    else {
        return 1;
    }
}

int p(int i){
    int sum=1;
    while(3-i){
        sum*=10;
        i++;
    }
    return sum;
}

int main(void){
    int n,m,sum,i,linel[4],lines[4],line[4],ans[4]={6,1,7,4},large,small,base,sign;
    char num[5];
    while(1){
        sum=0;
        sign=0;
        large=0;small=0;
        scanf("%s",num);
        n=atoi(num);m=n;
        for(i=0;i<4;i++){
                linel[i]=n/p(i);
                n=n%p(i);
                lines[i]=linel[i];
            }
        if(lines[0] == 0 && lines[1] == 0 && lines[2] == 0 && lines[3] == 0)
            break;
        if(linel[0] == linel[1] && linel[1] == linel[2] && linel[2] == linel[3]){
            sign = 1;
        }
        while(sign != 1){
            large=0;small=0;
            if(lines[0] == 6 && lines[1] == 1 && lines[2] == 7 && lines[3] == 4)
                break;
            qsort(lines,4,sizeof(int),(int (*)(const void *,const void *)) compar);
            qsort(linel,4,sizeof(int),(int (*)(const void *,const void *)) compar1);
            for(i=0;i<4;i++){
                large+=linel[i]*p(i);
                small+=lines[i]*p(i);
            }
            base=large-small;
            for(i=0;i<4;i++){
                lines[i]=base/p(i);
                linel[i]=lines[i];
                base=base%p(i);
            }
            sum++;
        }
        if(sign == 1)
            printf("NA\n");
        else
            printf("%d\n",sum);
    }
    return 0;
}