简单的模拟 #include <iostream> #include <cstdio> #include <cstring> using namespace std; void R(const char *s, char *t) { int d[10], j = 0; // 记录0到9各数字出现次数 memset(d, 0, sizeof(d)); for (int i = 0; s[i]; ++i) { ++d[s[i]-'0']; } for (int i = 0; i <= 9; ++i) { if (d[i] >= 10) { // 有两位数 t[j++] = d[i]/10 + '0'; t[j++] = d[i]%10 + '0'; t[j++] = i + '0'; } else if (d[i] > 0 && d[i] <= 9) { t[j++] = d[i] + '0'; t[j++] = i + '0'; } } t[j] = '\0'; } int main() { //freopen("temp.txt", "r", stdin); char n[16][81]; while (cin >> n[0] && n[0][0] != '-') { //情况一:转变一次后不变 R(n[0], n[1]); if (strcmp(n[0], n[1]) == 0) { cout << n[0] << " is self-inventorying" << endl; continue; } //情况二:k次后不变 bool flag2 = false; for (int i = 1; i <= 14; ++i) { R(n[i], n[i+1]); if (strcmp(n[i], n[i+1]) == 0) { cout << n[0] << " is self-inventorying after " << i << " steps" << endl; flag2 = true; break; } } if (flag2) continue; //情况3:k次后循环 bool flag3 = false; for (int i = 2; i <= 15; ++i) { //循环要大于1,不然就是第二种情况 for (int j = 0; j <= i-2; ++j) { if (strcmp(n[i], n[j]) == 0) { cout << n[0] << " enters an inventory loop of length " << i-j << endl; flag3 = true; break; } } if (flag3) break; } if (flag3) continue; else cout << n[0] << " can not be classified after 15 iterations" << endl; } }