记录下来题目及代码算是学习的过程以后方面查阅 题目介绍:6174猜想 ,1955年,卡普耶卡(D.R.KaPRekar)研究了对四位数的一种变换:任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1=m-rev(m),然后,继续对k1重复上述变换,得数k2.如此进行下去,卡普耶卡发现,无论k0是多大的四位数, 只要四个数字不全相同,最多进行7次上述变换,就会出现四位数6174. 输入一个n位数,操作输出序列,直到出现循环(即新得到的数曾经得到过)。输入保证在循环之前最多只会产生1000个整数。 输入: 1234
输出:
1234-->3087-->8352-->6174-->6174#include<iostream>#include<string.h>#include<algorithm>using namespace std;int cmp(int a, int b) { return a>b ? 1 : 0;}int serb(int *p, int b) { for (int i = 0; i<4; i++) { p[i] = b % 10; b /= 10; } return 0;}int bin(int *p) { int t = p[0]; for (int i = 1; i<4; i++) t = 10 *t + p[i]; return t;}int he(int b) { int p[4], q[4]; serb(p, b); serb(q, b); sort(p, p + 4, cmp); sort(q, q + 4); return bin(p) - bin(q);}intmain(void){ int a, sum[100]; memset(sum,0,sizeof(sum)); cin >> sum[0]; cout<<sum[0]<<"-->"; sum[1]=he(sum[0]);int i=1; for(;;){ sum[i]=he(sum[i-1]); cout<<sum[i]; int found=0; for(int j=0;j<i;j++) if(sum[j]==sum[i]){ found=1;break; } if(found)break; i++; cout<<"-->"; } return 0;}新闻热点
疑难解答