数列
题目大意:
有一个序列,
1
,
11
,
21
,
1211
,
111221
,
312211
1,11,21,1211,111221,312211
1,11,21,1211,111221,312211,形如上一个数有
x
1
x_1
x1个
x
2
x_2
x2,
x
3
x_3
x3个
x
4
x_4
x4,把x连起来即为当前数
原题:
题目描述
小S今天给你出了一道找规律题,题目如下: 有如下的数列1,11,21,1211,111221,312211,…… 小S问你这个数列的第N项是多少,而你一头雾水根本找不出规律。 聪明的小R悄悄地告诉你是这样的 1, 上一个数是一个1,写作11 上一个数是两个1,写作21 上一个数是一个2,一个1,写作1211 上一个数是一个1,一个2,两个1,写作111221, ………… 相信聪明的你一定可以解决这个问题。
输入
第一行包括一个正整数N。
输出
一行一个正整数(注意数字可能会唱过长整形,请注意用数组或者字符串存储)
输入样例
6
输出样例
312211
说明
对于100%的数据1<-N<=30。
解题思路:
直接按题意推即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std
;
int n
,k
,l
,a
[2][10005];
int main()
{
scanf("%d",&n
);
a
[1][0]=1;
a
[1][1]=1;
for (int i
=2;i
<=n
;++i
)
{
memset(a
[i
&1],0,sizeof(a
[i
&1]));
k
=0;
l
=a
[(i
+1)%2][1];
for (int j
=1;j
<=a
[(i
+1)%2][0];++j
)
if (a
[(i
+1)%2][j
]==l
) k
++;
else
{
a
[i
&1][++a
[i
&1][0]]=k
;
a
[i
&1][++a
[i
&1][0]]=l
;
l
=a
[(i
+1)%2][j
];
k
=1;
}
a
[i
&1][++a
[i
&1][0]]=k
;
a
[i
&1][++a
[i
&1][0]]=l
;
}
for (int i
=1;i
<=a
[n
&1][0];++i
)
putchar(a
[n
&1][i
]+48);
}