大数加法 + 斐波那契数列
程序员文章站
2024-03-22 13:39:04
...
Problem Description
度熊面前有一个全是由1构成的字符串,被称为全1序列。你可以合并任意相邻的两个1,从而形成一个新的序列。对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列。Input
这里包括多组测试数据,每组测试数据包含一个正整数N,代表全1序列的长度。
1≤N≤200
Output
对于每组测试数据,输出一个整数,代表由题目中所给定的全1序列所能形成的新序列的数量。
Sample Input
1
3
5
Sample Output
1
3
8
本来我想以为这是一个求全排列的题目,使用隔板法每次进行分类讨论,后来发现实现不了,最后算了算是个斐波那契,但是前200项的话数字太大,要用大数加法,现学的大数加法模拟,比过去用的简单许多,试了一下到200数字的长度为43,数组开50就够了
#include<stdio.h>
int num[201][51];
void previous_conduct()
{
num[0][0]=1;
num[1][0]=1;
num[2][0]=2;
for(int i=3;i<=200;i++)
{
int carry=0;
for(int j=0;j<=50;j++)
{
num[i][j]=(num[i-1][j]+num[i-2][j]+carry)%10; //每个地方都记得加上进位
carry=(num[i-1][j]+num[i-2][j]+carry)/10;
}
}
}
int main()
{
int n;
previous_conduct();
while(scanf("%d",&n)!=EOF)
{
for(int i=50;i>=0;i--)
{
if(num[n][i]!=0)
{
for(int j=i;j>=0;j--)
{
printf("%d",num[n][j]);
}
printf("\n");
break;
}
}
}
return 0;
}