HDU 1715 大菲波数

大菲波数

Time Limit: 1000/1000 MS (Java/Others)    

Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 20423    

Accepted Submission(s): 6891

Problem Description

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

 

Simple Output

1 1 2 3 5

 题解:一开始,用的int还真是interesting!!!wa了wa了,emmmm数据少的时候可以用这个吧,

       给你们看一下我的错误的思路,受走楼梯那个动态规划想到的。emmmm也算是个模板。

没有AC的代码:

 

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int fib(int num)
{
     if(num==1||num==2)
         return 1;
     int a=1;
     int b=1;
     int temp=0;
     for(int i=3;i<=num;i++)
     {
         temp=a+b;
         a=b;
         b=temp;
     }
     return temp;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int pi;
        scanf("%d",&pi);
        printf("%d\n",fib(pi));
    }
    return 0;
}

 

后来,emmmm因为是大数,所以肯定要开个数组,emmmm还得节约时间,

不能输一个数就从头算一个数,二维数组吧,加内存,减时间。

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int fib[1003][1003];
int main()
{
    memset(fib,0,sizeof(fib));
    fib[1][1]=1;
    fib[2][1]=1;
    for(int i=3;i<=1000;i++)
    {
        for(int j=1;j<=1000;j++)//这里加法运算真是剪不断,理还乱,这里最重要了,错了就全完蛋。
        {
            fib[i][j+1]=(fib[i][j]+fib[i-1][j]+fib[i-2][j])/10;
            fib[i][j]=(fib[i][j]+fib[i-1][j]+fib[i-2][j])%10;
        }
    }
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int pi;
        scanf("%d",&pi);
        int node=0;
        int i=1000;
        while(!fib[pi][i])
        {
             node=i;
             i--;
        }
        for(int i=node-1;i>=1;i--)
            printf("%d",fib[pi][i]);
        printf("\n");
    }
    return 0;
}

今天也是元气满满的一天!good luck!

posted @ 2017-09-09 20:55  ikefire  阅读(158)  评论(0编辑  收藏  举报