博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

hdu-1715 大斐波数

Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项Fibonacci数值。

Input输入第一行为一个整数N,接下来N行为整数Pi(1<=Pi<=1000)。
Output输出为N行,每行为对应的f(Pi)。
Sample Input
5
1
2
3
4
5
Sample Output
1
1
2
3
5
解题思路:此题的数值较大,即使无符号long long也难以存下,所以考虑用数组模拟大整数加法计算,代码如下;
#include <iostream>
#include <math.h>
#include <stdio.h>

using namespace std;
int  a[5000],b[5000],c[5000];
long long d[5000];
void f(int n)
{
    int m=1;
    a[1]=1;
    b[1]=1;
    for(int j=1; j<=n; j++)
    {
        for(int i=1; i<=m; i++)
        {
            c[i]=a[i]+b[i];
        }
        int te=0,ce;
        for(int i=1; i<=m; i++)
        {
            ce=te+c[i];
            c[i]=ce%10;
            te=ce/10;
        }
        while(te)
        {
            m++;
            c[m]=te%10;
            te/=10;
        }
        for(int k=1;k<=m;k++)
        {
            a[k]=b[k];
            b[k]=c[k];
        }
    }
    for(int i=m;i>=1;i--)
     printf("%d",c[i]);
     printf("\n");
}
void inin()
{
    int i;
    d[1]=1;
    d[2]=1;
    for(i=3;i<=1000;i++)
        d[i]=d[i-1]+d[i-2];
}
int main()
{
    int n;
    inin();
    scanf("%d",&n);
    while(n--)
    {
        fill(a+1,a+5000,0);
        fill(b+1,b+5000,0);
        fill(c+1,c+5000,0);
        int x;
        scanf("%d",&x);
        if(x>90)///做一个时间上的优化^-^
            f(x-2);///为啥是x-2? 看一下f函数.....
        else
            printf("%lld\n",d[x]);
    }
    return 0;
}

 

posted @ 2018-03-08 19:30  呦呦哟  Views(129)  Comments(0Edit  收藏  举报
Live2D