1019. 数字黑洞 (20)

2020-04-20 18:18:49 浏览数 (1)

给定任一个各位数字不完全相同的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

代码语言:javascript复制
#include <iostream>
using namespace std;

bool IsSame( int a)
{
    int num[4];
    for ( int i = 0 ; i < 4 ; i  ){
        num[i] = a % 10;
        a /= 10;
    }
    int tmp = num[0];
    int count = 1;
    for ( int i = 1 ; i < 4 ; i  ){
        if (num[i] == tmp){
            count  ;
        }
    }
    if ( count == 4){
        return true;
    }else{
        return false;
    }
}

int NotMaxSort(int Num)
{
    int num[4];
    for ( int i = 0 ; i < 4 ; i  ){
            num[i] = Num % 10;
            Num /= 10;
    }
    for ( int i = 0 ; i < 3 ; i  ){
        for ( int j = i   1 ; j < 4 ; j  ){
            if ( num[j] >= num[i] ){
                num[i] = num[i]   num[j];
                num[j] = num[i] - num[j];
                num[i] = num[i] - num[j];
            }
        }
    } 
    int sum = 0;
    for ( int i = 0 ; i < 4 ; i  ){
        sum = sum * 10   num[i];
    } 

    return sum;
}

int NotMinSort(int Num)
{
    int num[4];
    for ( int i = 0 ; i < 4 ; i  ){
            num[i] = Num % 10;
            Num /= 10;
    }
    for ( int i = 0 ; i < 3 ; i  ){
        for ( int j = i   1 ; j < 4 ; j  ){
            if ( num[j] <= num[i] ){
                num[i] = num[i]   num[j];
                num[j] = num[i] - num[j];
                num[i] = num[i] - num[j];
            }
        }
    } 
    int sum = 0;
    for ( int i = 0 ; i < 4 ; i  ){
        sum = sum * 10   num[i];
    } 

    return sum;
}

int main()
{
    int Num;
    cin>>Num;
        if ( IsSame(Num) == false){
            int a ,b ,c;
            do{
                a =  NotMaxSort(Num);
                b =  NotMinSort(Num);
                c = a - b;
                cout<<a<<" - ";
                if ( b == 0 ){
                    cout<<"0000 = "<<c<<endl;
                }else{
                    if ( b / 10 == 0){
                        cout<<"000"<<b<<" = "<<c<<endl;
                    }else{
                        if ( b / 100 == 0){
                            cout<<"00"<<b<<" = "<<c<<endl;
                        }else{
                            if ( b / 1000 == 0){
                                cout<<"0"<<b<<" = "<<c<<endl;
                            }else{
                                 cout<<b<<" = "<<c<<endl;
                            }
                        }
                    } 
                }
                Num = c;
            }while( c != 6174);
        }
        else{
            cout<<Num<<" - "<<Num<<" = 0000n"; 
        }

    return 0;
}

(PS:图中显示的错误实在找不出来了。)

ps

0 人点赞