6174问题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
数字中有一个非常神奇的数字: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
代码:
#include<stdio.h> #define bit 4 /*函数声明*/ void seperate(int *a,int b); void sort(int *a,int n); void swap(int *a,int *b); int min(int *a,int n); int max(int *a,int n); int statistic(int a); void print(int *a); int main() { int k; scanf("%d",&k); int num[k],i; for(i=0;i<k;i++) scanf("%d",num+i); for(i=0;i<k;i++) printf("%d\n",statistic(num[i]));/*输出结果*/ return 0; } /*将一个数的每一位依次存入数组中*/ void seperate(int *a,int b) { do{*(a++)=b%10;} while((b/=10)!=0); } /*对数组中的数字进行从小到大排序,使用冒泡排序算法*/ void sort(int *a,int n) { int i,j;//printf("sort\n"); for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]>a[j+1]) swap(a+j,a+j+1); } /*交换两个元素的值*/ void swap(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; } /*将数组中的数字组成一个有数组元素组成的最小的数*/ int min(int *a,int n) { int sign=1; a+=(n-1);/*将指针移到数组的最末端*/ int min=*a--; while(--n) { sign*=10; min+=*(a--)*sign; } return min; } /*将数组中的数字组成一个有数组元素组成的最大的数*/ int max(int *a,int n) { int sign=1;//printf("max\n"); int max=*a++; while(--n) { sign*=10; max+=*(a++)*sign; } return max; } /*统计从一个数到6174需要的步数*/ int statistic(int a) { int count=0,number,array[bit]; do { count++;/*统计计算的步数*/ number=a; seperate(array,a); sort(array,bit); a=max(array,bit)-min(array,bit); }while(a!=number); return count; }
-
第一行输入n,代表有n组测试数据。