1019 数字黑洞

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

 

    这一题有两个坑,一个是输出格式,减号和等号两边都有一个空格,这很容易忽略的,我前几次提交都显示有5个测试点格式错误,两个测试点答案错误,
加了空格以后就只剩下两个测试点答案错误;第二个坑就是有几个特殊的数据,注意题目中的这句话“注意每个数字按 4 位数格式输出”,举个例子,对
于输入0001、0002、0009、0013、0189这些数据,你按升序排序后输出的数据中前几位也都必须是0;并且如果两个数相减的结果是三位数,那你仍要按
四位数的格式输出,比如输入0001,有1000-0001=0999。所以做题的时候一定要细心!

     下面附上代码,代码注释也比较详细

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<functional>
 4 using namespace std;
 5 int main()
 6 {
 7     int N,big,small,flag=0,result=0;
 8     int arr[4];
 9     cin>>N;
10     while(result!=6174)
11     {
12         arr[0]=N/1000%10;//把N拆开存入arr
13         arr[1]=N/100%10;
14         arr[2]=N/10%10;
15         arr[3]=N%10;
16         if(arr[0]==arr[1]&&arr[1]==arr[2]&&arr[2]==arr[3])
17         {
18             cout<<N<<" - "<<N<<" = 0000";
19             return 0;
20         }
21         sort(arr,arr+4,greater<int>()); //非递增,即降序排列
22         big=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
23         sort(arr,arr+4,less<int>()); //非递减,即升序排列
24         small=arr[0]*1000+arr[1]*100+arr[2]*10+arr[3];
25         if(arr[0]==0&&arr[1]!=0)//升序排列时,前三位可能为零
26             flag=1; //只有第一位是0,第二位不是0
27         else if(arr[0]==0&&arr[1]==0&&arr[2]!=0)
28             flag=2; //前两位是0,第三位不是0
29         else if(arr[0]==0&&arr[1]==0&&arr[2]==0)
30             flag=3; //前三位都是0
31         result=big-small;
32         N=result; //如果结果不是6174,就再次循环
33         if(flag==1) //0189
34         {
35             cout<<big<<" - "<<'0'<<small<<" = "<<result<<endl;
36             flag=0;
37         }
38         else if(flag==2) //0013
39         {
40             cout<<big<<" - "<<"00"<<small<<" = "<<result<<endl;
41             flag=0;
42         }
43         else if(flag==3) //前三位都是0,又分两种情况
44         {
45             if(big>1000)//针对0002—0009这些数据
46             {
47                cout<<big<<" - "<<"000"<<small<<" = "<<result<<endl;
48                flag=0;
49             }
50             else  //针对0001这一个数据
51             {
52                cout<<big<<" - "<<"000"<<small<<" = 0"<<result<<endl;
53                flag=0;
54             }
55         }
56         else
57             cout<<big<<" - "<<small<<" = "<<result<<endl;
58     }
59     return 0;
60 }

ac了

 

posted @ 2020-05-01 12:42  和运气碰碰  阅读(365)  评论(0编辑  收藏  举报