1350:Cabric Number Problem

keyword

整数 C++

概要

10進数で考える。4桁の整数に対して、それを並び替えてできる最大の数と最小の数(leading 0もOK)の差を引くことを繰り返すと6174か0に落ちることが知られている。それをシミュレートする問題。
やるだけ、としか。あと問題文が色々不親切。

int ds[] = {1,10,100,1000};

void solve(int n){
    printf("N=%d:\n",n);
    if(n < 1000 || n > 9999 || n%1111==0){
        puts("No!!");
        return ;
    }
    if(n == 6174){
        puts("Ok!! 0 time");
        return ;
    }
    int cnt=0;
    while(1){
        int small = 0, big = 0;
        vector<int> digs;
        for(int k=0; k<4; k++){
            if(n < ds[k])break;
            digs.push_back((n/ds[k])%10);
        }
        sort(digs.begin(), digs.end());
        for(int i=0; i<digs.size(); i++)
            big += digs[i] * ds[i];
        reverse(digs.begin(), digs.end());
        for(int i=0; i<digs.size(); i++)
            small += digs[i] * ds[i];
        printf("%d-%d=%d\n",big, small, n=big-small);
        cnt++;
        if(n == 0 || n == 6174){
            printf("Ok!! %d %s\n", cnt, cnt>1?"times":"time");
            return ;
        }
    }
}