题目链接

题目描述
“伯爵说”序列如下: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;
}
posted on 2018-03-28 19:29  渡……  阅读(218)  评论(0编辑  收藏  举报