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了