链接如下:
“伯爵说”序列如下:1,11,21,1211,111221,…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≤n≤30)n(1 \leq n \leq 30)n(1≤n≤30)。
输出格式
输出第nnn个序列。注意,整数序列以字符串的形式表示。
这题类似于斐波那契数列的求解,我这里直接求了从第一项到第三十项的结果,避免重复计算.
同时利用了#include<sstream>这个头文件下的函数,进行int到string的转换.挺好用的.
#include<stdio.h>
#include<string>
#include<iostream>
#include<sstream>
using namespace std;
string change(string s);
string num(int n);
int main()
{
int n;
string str[31];
str[1]="1";
for(int i=2;i<31;i++)
str[i]=change(str[i-1]); //求1~30项的结果并存起来,每一项都要利用到上一项.函数作用看下面.
while(~scanf("%d",&n))
cout<<str[n]<<endl;
return 0;
}
string change(string s)
{
int count=1;
string s2;
for(int i=1;i<s.size();i++){
if(s[i]==s[i-1]) count++; //count 用来记录相通项的数量.
else{
s2+=num(count)+s[i-1]; //num();函数用来将相同项数量转换为string,以便后续的加和得到新的string.
count=1;
}
}
s2+=num(count)+s[s.size()-1];
return s2;
}
string num(int n)
{
string s;
stringstream x; // 这里用到刚才说到的#include<sstream>头文件下的函数,具体机理不了解,你可以百度.
x<<n;
x>>s;
return s;
}