模拟题
一些测试数据:
22 is self-inventorying 31123314 is self-inventorying 314213241519 enters an inventory loop of length 2 21221314 is self-inventorying after 2 steps 111222234459 enters an inventory loop of length 2 123456789 is self-inventorying after 5 steps 654641656 enters an inventory loop of length 2 2101400052100005496 enters an inventory loop of length 2 10000000002000000000 enters an inventory loop of length 3 333 is self-inventorying after 11 steps 1 is self-inventorying after 12 steps 99999999999999999999999999999999999999999999999999999999999999999999999999999999 can not be classified after 15 iterations 0000 enters an inventory loop of length 2 0001 is self-inventorying after 8 steps 0111 is self-inventorying after 8 steps 1111 is self-inventorying after 8 steps 123456789 is self-inventorying after 5 steps 456137892 is self-inventorying after 5 steps 123213241561 enters an inventory loop of length 2 543265544536464364 enters an inventory loop of length 2 5412314454766464364 is self-inventorying after 3 steps 543267685643564364 enters an inventory loop of length 2 5423434560121016464364 is self-inventorying after 3 steps
# include <stdlib.h>
# include <string>
# include <string.h>
# include <stdio.h>
char s[20][200];
int cmp (int i, int j) {
int t = strlen(s[i]) > strlen(s[j]) ? strlen(s[i]) : strlen(s[j]);
for (int x = 0; x < t; ++ x) {
if (s[i][x] != s[j][x]) return 0;
}
return 1;
}
int check(int k) {
for (int i = 0; i < k; ++ i) {
if (cmp(i, k)) return i;
}
return -1;
}
int go (int k) {
char t1[200];
int t2[11];
memset(t2, 0, sizeof(t2));
for (int i = 0; i < (int)strlen(s[k]); ++ i) {
++ t2[s[k][i] - '0'];
}
int cnt = -1;
for (int i = 0; i < 10; ++ i) {
if(t2[i] < 10 && t2[i] > 0) {
t1[++ cnt] = (char) ('0' + t2[i]);
t1[++ cnt] = (char) ('0' + i);
}
if (t2[i] > 9 && t2[i] < 100) {
t1[++ cnt] = (char) ('0' + t2[i] / 10);
t1[++ cnt] = (char) ('0' + t2[i] % 10);
t1[++ cnt] = (char) ('0' + i);
}
}
t1[++ cnt] = '\0';
memcpy(s[k + 1], t1, sizeof(t1));
if(k + 1 > 15) {printf ("%s can not be classified after 15 iterations\n", s[0]); return 0;}
if (check(k + 1) > 0) {
if(cmp(k + 1, k)) {
printf ("%s is self-inventorying after %d steps\n", s[0], k);
return 0;
}
else {
printf ("%s enters an inventory loop of length %d\n", s[0], k + 1 - check(k + 1));
return 0;
}
}
else if (check(k + 1) == 0) {
if(k == 0) {
printf ("%s is self-inventorying\n", s[0]);
return 0;
}
else {
printf ("%s enters an inventory loop of length %d\n", s[0], k + 1 - check(k + 1));
return 0;
}
}
go(k + 1);
return 0;
}
int main () {
memset (s, 0, sizeof(s));
for (;;) {
scanf ("%s", s[0]);
if (s[0][0] == '-') return 0;
go(0);
}
return 0;
}