記錄下來題目及代碼算是學習的過程以后方面查閱 題目介紹: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;}新聞熱點
疑難解答