数列
题目大意:
有一个序列,1,11,21,1211,111221,3122111,11,21,1211,111221,3122111,11,21,1211,111221,312211,形如上一个数有x1x_1x1个x2x_2x2,x3x_3x3个x4x_4x4,把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);//输出
}