Problem 1060 Fibonacci数列

来源:互联网 发布:产品展示动画制作软件 编辑:程序博客网 时间:2024/05/22 05:10

 Problem Description

1202年,意大利数学家斐波那契出版了他的《算盘全书》,在书中第一次提到了著名的Fibonacci数列,定义如下:

现在你的任务是求出Fibonacci数列的第n项。

 Input

输入数据由多组数据组成。每组数据一行,仅一个整数,表示n的值。

 Output

对于每组数据,输出仅一行,即Fibonacci数列的第n项。

我们保证输出的结果不会超过1000位数。

 Sample Input

20

 Sample Output

6765



我们最常见的关于Fibonacci数列的就是递归求解,但是当第N项太大时,时间就会很长。下面是递归代码

#include <stdio.h>int fibo(int n){if(n==0){return 0;}else if(n==1){return 1;}else if(n>1){return fibo(n-1)+fibo(n-2);}}int main(){int n;scanf("%d",&n);printf("%d\n",fibo(n));return 0;}

以下为AC代码:

/*思路:size是最大的位数,这里是1000,也就是说最后结果的位数最多只有1000位(好大了);所以只能用大小为1000的整形数组来存放这么大的数了。(初始化全为0)又因为Fibonacci数列的当前值,是前两个数之和,所以用两个数组模拟前两个数相加。如程序中所示,这两个数组分别是a,b;然后大小为1001,是因为多出来的那一位用来标记当前值一共有多少位,用a[0],b[0]来表示,记住:两个数组相加是从最后一位(最后一位是个位)开始相加的,也就是为什么a[1001],和b[1001]等于1的原因了。函数sum(a[],b[]);的作用是将a加到b上。相当于b=b+a;(这里需要用到a[0],因为如果知道了一共有多少位数,就可以只计算这些位数上的和,而不用计算所有位上的和,其它不需要的位为0,那样会浪费时间)函数put(a[]);的作用是把要求的第N项打印出来,因为数字存放在数组中,所以要从最高位一直打印到最后一位。(这里也需要用到a[0],结果有多少位)。到底是打印a还是b,与相加的顺序相关第三项时,把b加到a上,所以要打印a;第四项时,又把a加到b上,所以要打印b;如程序中所示,轮流的将a,b加到对方上面,为偶数的时候加到b上,为奇数的时候加到a上,所以打印的时候也要遵循这个规则。*/#include<stdio.h>#include<string.h>const int size=1000 ;/*将a加到b中*/void sum(int a[],int b[]){    int i,x ;    for(i=size;i>size-a[0];i--)    {        x=a[i]+b[i];                if(x>9)        {            x%=10 ;            b[i-1]++;        }        b[i]=x ;    }    if(b[i]==1)//数的长度增一    {        b[0]=a[0]+1 ;    }    else b[0]=a[0];}void put(int a[]){    int i ;    for(i=size-a[0]+1;i<=size;i++)    printf("%d",a[i]);}int main(){    int a[1001],b[1001];    int n,i ;    while(scanf("%d",&n)!=EOF)    {        memset(a,0,sizeof(a));        memset(b,0,sizeof(b));        a[1000]=1 ;        b[1000]=1 ;        a[0]=1 ;        b[0]=1 ;                for(i=3;i<=n;i++)        {            if(i%2==0)//轮流将a,b加到对方            sum(a,b);            else             sum(b,a);        }        if(n%2==0)put(b);//输出最后一次存放结果的数组        else put(a);        printf("\n");            }    return 0 ;}


原创粉丝点击