https://nanti.jisuanke.com/t/23
- 时间限制 1000ms
- 空间限制 65536K
“伯爵说”序列如下:1,11,21,1211,111221,…。其1
读作one 1
或者11
。11
读作two 1s
或者21
。21
读作one 2, one 1
或者1211
。
输入格式
多组输入,读到文件结束。每组输入给定一个整数 n(1≤n≤30)。
输出格式
输出第 n 个序列。注意,整数序列以字符串的形式表示。
样例输入
6
样例输出
312211
提示
相信你已经看懂了题目,如果没看懂,小提示下,
其实类似于求“斐波那契”数列的第 n 项哦~
解题思路
我是用的结构体做的,一个存每一位的数,另一个存有多少位。类似于斐波那契,首先先打表。
#include <iostream>
using namespace std;
struct node {
int s[4500], n;
}fib[35];
int main()
{
int n, m;
fib[0].s[fib[0].n++] = 1; //第一个序列为1
for (int i = 1; i < 30; i++)
{
m = 0; //记录上个序列每一位的个数
for (int j = 0; j < fib[i - 1].n; j++)
{
m++; //个数加1
if (fib[i - 1].s[j] != fib[i - 1].s[j + 1])
{
fib[i].s[fib[i].n++] = m; //先把位的个数存下来
fib[i].s[fib[i].n++] = fib[i - 1].s[j]; //再把这一位存下来
m = 0; //相邻两项不同,则开始重新计数
}
}
}
while (cin >> n)
{
for (int j = 0; j < fib[n - 1].n; j++)
cout << fib[n - 1].s[j];
cout << endl;
}
return 0;
}