数列
题目
小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<cstring>
#include<cstdio>
using namespace std;
int n,a[100001],l=1,aa[100001],ll,b,c;
int main()
{
scanf("%d",&n);//读入
a[1]=1;//初始化
for (int i=2;i<=n;i++)
{
memset(aa,0,sizeof(aa));//初始化
ll=0;b=a[1];c=1;//初始化
for (int j=2;j<=l;j++)
if (a[j]==b) c++;//与前一个数字相同
else//不同
{
if (c<10) aa[++ll]=c,aa[++ll]=b;//判断连续个数为一位数的情况
else//个数为多位数
{
int ee=0;
while (c)
{
ll++;
for (int k=ee;k>=1;k--) a[ll]=a[ll-1];
aa[ll-ee]=c%10;
c/=10;
}
aa[++ll]=b;
}
b=a[j];c=1;//初始化
}
if (c)//处理最后的连续串
{
if (c<10)
{
aa[++ll]=c;
aa[++ll]=a[l];
}
else
{
int ee=0;
while (c)
{
ll++;
for (int k=ee;k>=1;k--) a[ll]=a[ll-1];
aa[ll-ee]=c%10;
c/=10;
}
aa[++ll]=b;
}
}
l=ll;//标记长度
memset(a,0,sizeof(a));//初始化
for (int j=1;j<=l;j++) a[j]=aa[j];//记录数组
}
for (int i=1;i<=l;i++)
printf("%d",a[i]);//输出
return 0;
}