题目描述
“伯爵说”序列如下:1,11,21,1211,111221, \ldots1,11,21,1211,111221,…。其1读作one 1或者11。11读作two 1s或者21。21读作one 2, one 1或者1211。
输入格式
多组输入,读到文件结束。每组输入给定一个整数 n(1 \leq n \leq 30)n(1≤n≤30)。
输出格式
输出第 nn 个序列。注意,整数序列以字符串的形式表示。
样例输入
6
样例输出
312211
分析:
读了两遍题,硬是没读懂题目是什么意思,这是语文有问题,~~~
好了,先来说一下题目是什么额意思吧
1.初始状态下我们有一个1
2.基于1统计里面相邻的相同数字的个数,只有一个1,所以下一个串就应该是11,
3.现在基于11来统计,里面有两个连续的1,所以下一个串就是21,
4.基于21来统计,脸面有一个连续的2,一个连续的1,所以下一个串就是1211,
5.基于1211来统计,依次有一个连续的1,一个连续的2,两个连续的1,所以下一个串就是111221,
6.基于111221来统计,依次有三个连续的1,两个连续的2,一个连续的1,所以下一个串就是312211,
······
这样挨个的统计下来,知道第n个就是所要求得。
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
string ans="1";//初始的字符串
for(int i=1; i<n; i++)//因为要求的是第n个,而第一个已经知道了,所以再循环n-1次即可
{
string temp="";//临时的变量,用来存当前计算出来的这个字符串
int cnt=1;
char ch_now=ans[0];
for(int j=1; j<ans.length(); j++)//应该遍历的是上一个串
{
if(ans[j]==ch_now)//和前一个相等,只将计数个数加
cnt++;
else
{
temp+=cnt+'0';//现将前一个字母的个数存下来
temp+=ch_now;//再讲这个字母存下来
cnt=1;//计数归1
ch_now=ans[j];//接着要找的字符为当前的字符
}
}
//将最后一个字母的情况也要记录下来
temp+=cnt+'0';//猜测连续数组的个数应该不会超过十个,
temp+=ch_now;
ans=temp;
}
cout<<ans<<endl;
}
return 0;
}