这是一道水题,关键读懂题目和注意分类讨论。直接上代码。
#include<iostream>
#include<string>
using namespace std;
int main(){
string source;
string *change = new string[15];
string temp;
int key[10];
bool inventory,sinventory,linventory;
while(cin>>source){
if(source == "-1")
break;
int iteration = 0,len;
inventory = sinventory = linventory = false;
for(int i =0;i<15;++i)
change[i] = "";
while(iteration <15){
memset(key,0,sizeof(key));
temp = "";
if(iteration == 0){
for(int i =0;i<(int)source.length();i++)
key[source[i]-'0']++;
}
else{
for(int i =0;i<(int)change[iteration-1].length();i++)
key[change[iteration-1][i]-'0']++;
}
for(int j =0;j<10;j++){
int value = j;
int times = key[j];
if(times == 0)
continue;
else if(times >=10){
change[iteration].push_back(times/10+'0');
change[iteration].push_back(times%10+'0');
}
else
change[iteration].push_back(times+'0');
change[iteration].push_back(value+'0');
}
if(iteration == 0 && source == change[iteration]){
inventory = true;
break;
}
if(iteration >0){
if(change[iteration] == change[iteration-1]){
len = iteration;
sinventory = true;
break;
}
else{
int begin = iteration-2;
while(begin>=0 && change[iteration]!= change[begin])
--begin;
if(begin >=0){
len = iteration-begin;
linventory = true;
break;
}
}
}
iteration++;
}
if(iteration >= 15)
cout<<source<<" can not be classified after 15 iterations"<<endl;
else if(inventory == true)
cout<<source<<" is self-inventorying"<<endl;
else if(linventory == true)
cout<<source<<" enters an inventory loop of length "<<len<<endl;
else if(sinventory == true)
cout<<source<<" is self-inventorying after "<<len<<" steps"<<endl;
}
return 0;
}