3382 - 卡布列克圆舞曲
时间限制 : 1 秒
内存限制 : 128 MB
卡布列克是一位数学家,他在研究数字时发现:任意一个不是用完全相同数字组成的四位数,如果对它们的每位数字重新排序,组成一个较大的数和一个较小的数,然后用较大数减去较小数,差不够四位数时补零,类推下去,最后将变成一个固定的数:6174,这就是卡布列克常数。
例如:4321-1234=3087
8730-378=8352
8532-2358=6174
7641-1467=6147
如果K位数也照此办理,它们不是变成一个数,而是在几个数字之间形成循环,称作卡布列克圆舞曲。例如对于五位数54321:
54321-12345=41976
97641-14679=82962
98622-22689=75933
97533-33579=63954
96543-34569=61974
97641-14679=82962
我们把82962 75933 63954 61974称作循环节,即卡布列克圆舞曲。
题目输入
文件包含若干行,每行为一个待求“卡布列克圆舞曲”的起始整数(小于231-1)
题目输出
每行为对应整数的循环节,数据之间用空格隔开。
输入/输出样例
输入格式
4321 54321
输出格式
6174 82962 75933 63954 61974
C++解答
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long len; char k[20000]; char d[20000]; char x[20000]; long long r[20000]; long long t=1,z; char ddx(char b[]) { sort(b,b+len,greater<char>()); } char xdd(char b[]) { sort(b,b+len,less<char>()); } bool cx(long long q) { for(long long i=1;i<=z-1;i++) if(r[i]==q) return 1; return 0; } int main() { //freopen(""kblk.in"",""r"",stdin); //freopen(""kblk.out"",""w"",stdout); long long t=-1; while(scanf("%s",&k)!=EOF)//对于不知道多少组输入数据的解决办法 { z=1;//下标注意要清0; sscanf(k,"%lld",&t); memset(r,0,sizeof(r));//对于每一个数,r数组别忘了清0; r[z]=t;//要加上本身这个数字,坑这了 ;循环节有可能从他本身就是。 while(cx(t)==0) { if(strlen(k)==4) { printf("%s\n","6174"); continue; } else len=strlen(k); ddx(k); strcpy(d,k); xdd(k); strcpy(x,k); long long ds,xs; sscanf(d,"%lld",&ds); sscanf(x,"%lld",&xs); t=ds-xs; r[++z]=t; sprintf(k,"%lld",t); } for(long long i=1;i<=z;i++) { if(r[i]==t) { for(long long j=i;j<=z-2;j++) cout<<r[j]<<' '; cout<<r[z-1]; //题库最后的空格是不忽略的 cout<<endl; break; } } continue; } }