///模拟,按照题目所述,进行一次inventorying就判断一次,若有符合的就退出循环 #include<stdio.h> #include<string.h> char ini[20][150]; char s[5]; int num[10]; int len; int change(int k) { len=strlen(ini[k]); memset(num,0,sizeof(num)); int i,j,t; for(i=0;i<len;i++) num[ini[k][i]-48]++; j=0; for(i=0;i<10;i++) { if(num[i]) { sprintf(s,"%d",num[i]); len=strlen(s); for(t=0;t<len;t++) ini[k+1][j++]=s[t]; ini[k+1][j++]=i+48; } } ini[k+1][j++]='/0'; return 0; } int decide() { int ok=0,i,j,t; for(i=0;i<15;i++) { change(i); //printf("%s/n",ini[i]); j=i+1; if(strcmp(ini[j],ini[0])==0) { if(j==1) { printf("%s is self-inventorying/n",ini[0]); ok=1; break; } } if(strcmp(ini[j],ini[j-1])==0) { printf("%s is self-inventorying after %d steps/n",ini[0],j-1); ok=1; break; } for(t=0;t<j-1;t++) { if(strcmp(ini[j],ini[t])==0) { printf("%s enters an inventory loop of length %d/n",ini[0],j-t); ok=1; break; } } if(ok) break; } if(!ok) printf("%s can not be classified after 15 iterations/n",ini[0]); return 0; } int main() { while(scanf("%s",ini[0])==1) { if(ini[0][0]=='-') break; decide(); } return 0; }