题目链接:http://poj.org/problem?id=1016
解释下题意,对一列数进行转换依次升序输出数字输出的次数和这个数字,比如
31123314中,1有3个,2有一个,3有3个,4有1个,那么转换为31123314,
题目要求写出数子的特性,有如下几种
- 自我循环,既转换一次后就与原来相同;
- j步转换后有与前一次相同的数字,之后开始循环;
- j步转换后与与前面,但不是前一次的相同那么永远不能循环:
- 15次转换后都没有结果!
这题利用了string,这个字符串比普通char强大太多,对于数组的添加写入分离,以及计算都方便太多了,有普通整形数组应该也能做,不过麻烦点!
解释下思路,编写work完成一次转换,其中利用w保存每个数的次数,其中应该注意,次数如果大于9就要输出两格了,然后循环15次一次转换字符串,每次转换后与前面的情况比较,看是否有相同的,如果相同则跳出,根据循环次数,以及对比的次数,分析各种情况;
- 循环1次
- 循环i次后,对比了j次;
- 循环i次后,对比了不到j次;
- 循环了15次!
其中有个小问题让我郁闷了半天C++提交老是编译错误,我G++编译就没问题,后来搞了半天才知道C++里不叫cstring叫string!郁闷!
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
|
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> using namespace std;
string str[16]; void work(int t) { int i,w[10]={0}; for(i=0;i<(int)str[t].size();i++) w[str[t][i]-'0']++; string s=""; for(i=0;i<10;i++) if(w[i]>0&&w;[i]<10) { s+=w[i]+'0'; s+=i+'0'; } else if(w[i]>=10) { s+=w[i]/10+'0'; s+=w[i]%10+'0'; s+=i+'0'; } str[t+1]=s; }
int main() { int i,j,flag; while(cin>>str[0]&&str;[0][0]!='-') { for(i=0;i<15;i++) { flag=0; work(i); for(j=0;j<=i;j++) if(str[i+1]==str[j]) { flag=1; break; } if(flag==1) break; } if(flag) { if(i==0) cout<<str[0]<<" is self-inventorying"<<endl; else if(j==i) cout<<str[0]<<" is self-inventorying after "<<i<<" steps"<<endl; else cout<<str[0]<<" enters an inventory loop of length "<<i-j+1<<endl; } else cout<<str[0]<<" can not be classified after 15 iterations"<<endl; } }
|