1019 数字黑洞(20 分)

给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。

例如,我们从6767开始,将得到

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

现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。

输入格式:

输入给出一个 (0,104​​) 区间内的正整数 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
/*因为此题是限制输入输出都是4位数,所以使用字符串再转为int型进行计算会很麻烦,不提倡使用
用int型数组可以保证排序时肯定都为4位数,不会丢失0*/
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n;
    int c=0,d=0,j,s=0;//c为被减数,d为减数,s为差
    int a[4];
    cin>>n;
    int q=n;
    while(s!=6174){//很坑的一点,输入的n为6174还是要进行计算,只有差s为6174时,才能终止程序
        d=c=0;
    for(int i=0;i<4;i++){//将q分解为a;
        a[i]=q%10;
        q=q/10;
    }
    sort(a,a+4);//非递减排序
    j=1;
    for(int i=0;i<4;i++){
        c=c+a[i]*j;
        j*=10;
    }
    j=1;
    for(int i=3;i>=0;i--){
        d=d+a[i]*j;
        j*=10;
    }
    if(c-d==0){
        cout<<n<<" - "<<n<<" = 0000";
        break;
    }
    s=c-d;
    q=s;
    for(int i=3;i>=0;i--){//c和d不一定是4位数
        cout<<a[i];
    }
    cout<<" - ";    
    for(int i=0;i<4;i++){
        cout<<a[i];
    }
    printf(" = %04d",s);
    if(s!=6174){
    cout<<endl;
}
}
}
原文地址:https://www.cnblogs.com/fromzore/p/9544725.html