题意:给出数字串 对数字串进行压缩,判断压缩后的串 会不会形成循环;循环的情况有,第一次压缩就产生循环,压缩n次后循环,或者 k个压缩形成循环。只需要对15次压缩进行判断;
思路:模拟题目给出的压缩方法 对数字串压缩,保存15次压缩产生的串;
三种情况 讨论;
忘记对n 字符串加 结束,RE4次 ,输出少一个空格PE一次、无语了、
#include <iostream>
using namespace std;
char n[16][100];
void R(int a, int b)
{
int t[10]={0},len=0,i;
for(i=0; i<strlen(n[a]); i++)
t[ n[a][i]-'0' ]++;
for(i=0; i<10; i++)
{
if(t[i])
{
if(t[i]>=10) n[b][len++]=t[i]/10+'0';
n[b][len++] = t[i]%10+'0';
n[b][len++] = i+'0';
}
}
n[b][len]='\0';
}
void cheak()
{
int i,j;
if(!strcmp(n[0],n[1]))
{
cout<<n[0]<<" is self-inventorying"<<endl;
return ;
}
for(i=1; i<15; i++)
{
if(!strcmp(n[i], n[i+1]))
{
cout<<n[0]<<" is self-inventorying after "<<i<<" steps"<<endl;
return ;
}
}
for(i=0; i<15; i++)
for(j=i+2; j<=15; j++)
{
if(!strcmp(n[i], n[j]))
{
cout<<n[0]<<" enters an inventory loop of length "<<j-i<<endl;
return ;
}
}
cout<<n[0]<<" can not be classified after 15 iterations"<<endl;
}
int main()
{
while(cin>>n[0])
{
if(n[0][0]=='-') return 0;
for(int i=0; i<15; i++)
R(i, i+1);
cheak();
}
}