数列

数列

题目

小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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值