描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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
-
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> //快速排序比较函数 int com(const void *a,const void *b) { //升序排列 return (*(char *)a - *(char *)b); } //求最大值最小值函数 void ToNum(char ch[],int *max,int *min) { *max = 0; int len = strlen(ch);//求出数组的有效长度 qsort(ch,len,sizeof(ch[0]),com);//从小到大排序 *min = strtol(ch,NULL,10);//得到最小数字 for(int i = len - 1; i >= 0; i --)//for循环得到最大数字 { *max += (ch[i] - '0') * (int)pow(10,i); } } int main() { int T,max,min,max_min,count = 0,temp,t; char toNum[10];//以字符型保存输入的数据 scanf("%d",&T);//读取循环次数 while(T --) { scanf("%s",toNum); max_min = strtol(toNum,NULL,10);//保留原始数据 for(count = 1;;count ++) { //printf("第count = %d 次循环\n",count); ToNum(toNum,&max,&min);//得到最大最小值 //printf("max = %d,min = %d,max_min = %d\n",max,min,max - min); if(max - min == max_min)//如条件满足则推出循环,输出结果 break; else{//条件不满足,改变max_min的值,并将该值输入到数组toNum中,工下次循环使用 max_min = max - min; sprintf(toNum,"%d",max_min); //printf("%s,count = %d\n",toNum,count); } } printf("%d\n",count); } return 0; }
这里介绍下代码中运用的几个函数(这里仅介绍题目中用到的功能,详细介绍点击相关链接):
sprintf(数组名s,格式控制符(如%d),参数t);点击这里了解详情
功能:将数字 t 转换为字符,并存于数组中s中;
返回值:成功则返回参数s字符串长度,失败则返回-1
strtol(数组名,NULL,进制);点击这里了解详情
功能:将字符转换为数字;
返回值:成功返回该数字;