题目:
输入一个n位数,把所有数字从大到小排序得到a,从小到大得到b,然后用a-b替换原来这个数
并且继续操作。例如从1234 出发,4321-1234=3087、8730-378=8352、8532-2358=6174 7641-1467=6174,回到了它自己。
输入一个n位数,输出操作序列,直到出现循环(即新得到的数曾经得到过),保证在循环之前最多只会产生1000个整数。
样例输入:1234样例输出:1234->3087->8352->6174->6174
思路:先要把各个数据排序,得到两个数的差作为下一个输入的数,因为这个过程会多次利用,所以最好写成函数。第二步逐步生成各个数,并判断该数是否出现过,最常用的是数组。
另外需注意,此时涉及到一个字符串反转问题,不要直接用strrev函数解决,因为不是ANSIC的,该种方法是最简便易行的,需要记住。
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #define MAXN 5000 int get_next(int x) //获取下一个字符,可是输入的是数字,要用sscanf换成字符的格式, { char f[5]; int a,b; sprintf(f, "%d", x); //sprintf的作用是将数字变量转换成字符串 int n = strlen(f); for(int i = 0; i < n; i++) //冒泡排序后得到的数为递增排列 ,所以得到的数值为小的! for(int j = i + 1; j < n ; j++) if(f[i]>f[j]) { char s = f[i]; f[i] = f[j]; f[j] = s; } sscanf(f , "%d", &a); //sscanf的作用是从字符串中取出其他格式的数据放到变量a中 for(int i = 0; i < n/2 ; i++) //字符串反转,即将字符串的顺序倒过来 { char t = f[i]; f[i] = f[n-1-i]; f[n-1-i] = t; } sscanf(f, "%d", &b); //存到数值b中 return ( b - a); } int main() { int num[MAXN],count = 1; scanf("%d", &num[0]); printf("%d", num[0]); for( ; ; ) { num[count] = get_next(num[count-1]); printf("->%d", num[count]); int found = 0; for(int i = 0; i < count; i++) { if(num[i] == num[count]) //即新得到的数在原来得到的数出现过 { found = 1; break; } } if(found) break; count++; } printf("\n"); return 0; }