Tell me the length | ||||||
| ||||||
Description | ||||||
A number sequence is defined as following: | ||||||
Input | ||||||
The input consists of multiple test cases. Each test case contains one integers n. | ||||||
Output | ||||||
Length of S(n). | ||||||
Sample Input | ||||||
2 5 0 | ||||||
Sample Output | ||||||
2 6 | ||||||
Author | ||||||
彭文文@Amber |
这是我们校去年的省赛选拔的题目,找个半个小时的规律没找到,学长告诉我的规律,当时明白了之后笑喷了。
规律是这样的:我们先拿出样例。
S(1)=1,
S(2)=11,
S(3)=21,
S(4)=1211,
S(5)=111221,
S(6)=312211,
s1中有1个1
s2=11;
s2中有两个1
s3=21;
s3中有1个2,一个1
s4=1211
s4中有1个1 1 个2 2个1
然后s5就是111221.。。。。。。。。。
看到规律之后笑喷。。。。。。。那这个题手写打表可能得到正确的结果吗?--------------除非你足够细心并且有耐心。。。。
所以我们这里模拟搞定:
#include<stdio.h>
#include<string.h>
using namespace std;
char a[55][6000];
int main()
{
a[1][0]='1';
a[1][1]='\0';
//printf("%d\n",strlen(a[1]));
for(int i=1;i<=30;i++)
{
int weizi=0;
int n=strlen(a[i]);
for(int j=0;j<n;j++)
{
char c=a[i][j];
int cont=0;
for(int k=j;k<n;k++)
{
if(a[i][k]==c)
cont++;
else
break;
}
a[i+1][weizi]=cont+'0';
weizi++;
a[i+1][weizi]=c;
weizi++;
j+=cont-1;
}
a[i+1][weizi]='\0';
}
int n;
while(~scanf("%d",&n))
{
if(n==0)break;
printf("%d\n",strlen(a[n]));
}
}