题目:
序列规律如下:
- 1
- 11
- 21
- 1211
- 111221
- 312211
- ……
输入:一个整数K
输出:第K个字符串
分析:首先其实这个字符串的规律就有挺多人看不出来:它的规律是:下面字符串是对上面字符串的描述
第2个字符串描述第1个字符串有1个1,所以是11
第3个字符串描述第2个字符串有2个1,所以是21
第4个字符串描述第3个字符串有1个2和1个1,所以是1211
第5个字符串描述第4个字符串有1个1和1个2和2个1,所以是111221
第6个字符串描述第5个字符串有3个1和2个2和1个1,所以是312211,
(原题目是212211,那么理解就是这里如果超过2,还是要按2来,但是我觉得按3来更好)
……
代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string num2string(int x){ //注意可能有双位数字的出现
string ret = "";
while (x){
ret += x % 10 + '0';
x /= 10;
}
reverse(ret.begin(), ret.end());
return ret;
}
string getAns(string pre){//通过前一个数字序列获得下一个数字序列
string ret = "";
int count = 1;
for (int i = 0; i < pre.size(); i++){
if (i == pre.size() - 1 || pre[i] != pre[i + 1]){ //注意零界条件
ret += num2string(count);
ret += pre[i];
count = 1;
}
else{
count++;
}
}
return ret;
}
string ans[21];
int main(){
ans[1] = "1";
for (int i = 2; i <= 10; i++){
ans[i] = getAns(ans[i - 1]);
}
for (int i = 1; i <= 10; i++){
cout << ans[i] << endl;
}
return 0;
}
运行结果:
——Apie陈小旭