6174问题
假设一个各位数字不相同的四位数,把所有数字从大到小排序后得到a, 从小到大排序后得到b,然后用a-b替换原来这个数,继续操作。例如,从1234出发,依次有4321-1234=3078,8730-378=8352,8532-2358=6174,7641-1467=6174,回到了自己。
输入一个n位数,输出操作序列知道出现循环。
样例输入:1234 样例输出:1234 -> 3078 -> 8352 -> 6174 -> 6174
程序:
#include<iostream> #include<cstring> #include<stdio.h> using namespace std; int num[2000]; int cnt; bool found; int getNext(int n) { int a, b; char s[10], t; sprintf(s, "%d", n); //将整数打印成字符串保存到s中 int len = strlen(s); for(int i = 0; i < len; i++) { for(int j = i + 1; j < len; j++) { if(s[i] > s[j]) { t = s[i]; s[i] = s[j]; s[j] = t; } } } sscanf(s, "%d", &a); //从s中读入数据 for(int i = 0 ; i < len / 2; i++) { t = s[i]; s[i] = s[len - 1 - i]; s[len - 1 - i] = t; } sscanf(s, "%d", &b); return b - a; } int main() { cin >> num[0]; cout << num[0]; cnt = 1; while(true) { num[cnt] = getNext(num[cnt - 1]); cout << " -> " << num[cnt]; found = false; for(int i = 0; i < cnt; i++) { if(num[i] == num[cnt]) { found = true; break; } } if(found) break; cnt++; } cout << endl; return 0; }
时间: 2024-10-29 22:09:54