oyoj57 -6174问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oyoj57 -6174问题相关的知识,希望对你有一定的参考价值。
描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数
比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4
- 输入
- 第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数 - 输出
- 经过多少次上面描述的操作才能出现循环
- 样例输入
-
1 1234
- 样例输出
-
4
1 #include<cstdio> 2 #include<cstdlib> 3 #include<algorithm> 4 using namespace std; 5 #define Max 1000 6 int ans[Max]; 7 bool cmpn(const char& a,const char& b) 8 { 9 if(a<b) return true; 10 else return false; 11 } 12 bool cmpx(const char& a,const char& b) 13 { 14 if(a>b) return true; 15 else return false; 16 } 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 while(n--) 22 { 23 scanf("%d",&ans[0]); 24 int amax,amin; 25 char a[4]; 26 sprintf(a, "%d", ans[0]); 27 for(int i=1 ;; i++) 28 { 29 sort(a,a+4,cmpx); 30 //printf("%s\n",a); 31 sscanf(a, "%d", &amax); 32 sort(a,a+4,cmpn); 33 //printf("%s\n",a); 34 sscanf(a, "%d", &amin); 35 ans[i] = amax-amin; 36 if(ans[i]==ans[i-1]) 37 { 38 printf("%d\n",i); break; 39 } 40 else 41 { 42 sprintf(a, "%d", ans[i]); 43 } 44 } 45 } 46 return 0; 47 }
注意:排序时先从大到小,再从小到大。
定义函数 int sscanf (const char *str,const char * format,........);函数说明sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。返回值 成功则返回参数数目,失败则返回-1,错误原因存于errno中。 返回0表示失败 否则,表示正确格式化数据的个数 例如:sscanf(str,"%d%d%s", &i,&i2, &s); 如果三个变成都读入成功会返回3。如果只读入了第一个整数到i则会返回1。证明无法从str读入第二个整数。
char input[ ]=”10 0x1b aaaaaaaa bbbbbbbb”; char s[5]; sscanf(input,”%d %x %5[a-z] %*s %f”,&i,&j,s,s); printf(“%d %d %s ”,i,j,s); 执行 10 27 aaaaa
以上是关于oyoj57 -6174问题的主要内容,如果未能解决你的问题,请参考以下文章