
本文共 3991 字,大约阅读时间需要 13 分钟。
For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second number from the first one. Repeat in this manner we will soon end up at the number 6174 – the black hole of 4-digit numbers. This number is named Kaprekar Constant.
For example, start from 6767, we’ll get:
7766 - 6677 = 1089
9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174 7641 - 1467 = 6174 … …Given any 4-digit number, you are supposed to illustrate the way it gets into the black hole.
Input Specification:
Each input file contains one test case which gives a positive integer N in the range (0,104).
Output Specification:
If all the 4 digits of N are the same, print in one line the equation N - N = 0000. Else print each step of calculation in a line until 6174 comes out as the difference. All the numbers must be printed as 4-digit numbers.
Sample Input 1:
6767
Sample Output 1:
7766 - 6677 = 1089
9810 - 0189 = 9621 9621 - 1269 = 8352 8532 - 2358 = 6174Sample Input 2:
2222
Sample Output 2:
2222 - 2222 = 0000
题目大意:
对于除了所有数字都相同的整数以外的任何4位整数,如果我们先按非升序对数字进行排序,然后再按非降序对数字进行排序,则可以通过从数字中取第二个数字来获得新数字。第一。以这种方式重复一次,我们很快就会结束于数字6174-4位数字的黑洞。该数字称为Kaprekar Constant。
例如,从6767开始,我们将获得:
7766-6677 = 1089
9810-0189 = 9621 9621-1269 = 8352 8532-2358 = 6174 7641-1467 = 6174 ……给定任何4位数字,您应该说明它进入黑洞的方式。
输入规格:
每个输入文件包含一个测试用例,该用例给出一个在(0,10 4)范围内的正整数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
思路:
第一次发现 string 里居然可以用 sort 排序,神奇
代码1:
(希望以后会觉得这个代码也很垃圾。。)
#includeusing namespace std; void zhuan(string &a,string &b,string now) // 记录第一个数(要加&,才能加到本身),记录第二个数,没排序的数{ sort(now.begin(),now.end()); //字符串内从小到大排序 a = now; //记录该值 reverse(now.begin(),now.end()); //倒置 从大到小 b = now; //记录该值}string tostring(int x) //数字转string //这个pat每次用to_string都过不了,可能是我入场方式不对,手写一个{ string s; while(x) //数字转成string { s += x%10+'0'; x/=10; } while(s.size()<4) //不够四位数,前面添加0 s = '0' + s; return s;}int main() { int n; cin>>n; string s1,s2; zhuan(s1,s2,tostring(n)); int num1 = stoi(s1); //字符转数字 int num2 = stoi(s2); //相等直接输出 if(s1==s2) printf("%04d - %04d = 0000\n",num1,num2); else { //因为num1是sort排序的,所以经过倒置的num2一定比num1大 while(num2 - num1 != 6174) //不断循环,直到6174出现 { printf("%04d - %04d = %04d\n",num2,num1,num2-num1); zhuan(s1,s2,tostring(num2-num1)); num1 = stoi(s1); num2 = stoi(s2); } printf("%04d - %04d = %04d\n",num2,num1,num2-num1); } return 0;}
代码2(慎看):
想起这道题以前做过(当时只会c),看了一眼代码,直接裂开
#include#include #include void change1(char *a,int *x){ *x=0; *x+=(a[0]-'0')*1000; *x+=(a[1]-'0')*100; *x+=(a[2]-'0')*10; *x+=(a[3]-'0');}void change2(int *x,char *a){ a[0]='0'+*x/1000; a[1]='0'+*x/100%10; a[2]='0'+*x/10%10; a[3]='0'+*x%10;}void AList(char *a1,int *sum1){ char t; int i,j; for(i=1;i<4;i++) { for(j=0;j<4-i;j++) { if(a1[j] a2[j+1]) { t=a2[j]; a2[j]=a2[j+1]; a2[j+1]=t; } } } *sum2=0; *sum2=*sum2+(a2[0]-'0')*1000; *sum2=*sum2+(a2[1]-'0')*100; *sum2=*sum2+(a2[2]-'0')*10; *sum2=*sum2+(a2[3]-'0');}int main(){ char a[5],a1[5],a2[5]; int n,sum=0,sum1,sum2; scanf("%d",&n); change2(&n,a); if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]) { printf("%s - %s = 0000\n",a,a); } else { while(sum!=6174) { strcpy(a1,a); strcpy(a2,a); AList(a1,&sum1); BList(a2,&sum2); sum=sum1-sum2; change2(&sum,a); printf("%s - %s = %s\n",a1,a2,a); } } return 0;}
发表评论
最新留言
关于作者
