NYOJ461---&&HDU1568-----Fibonacci数列(四)

Fibonacci数列(四)
时间限制:1000 ms  |  内存限制:65535 KB
链接: NYOJ461,HDU1568。
描述
     数学神童小明终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
    接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位(高4位)就可以了,
可是CodeStar自己又记不住。于是他决定编写一个程序来测验小明说的是否正确。
 首先:看到这个题的数据范围,0(n)的时间复杂度是不行的。

 然后想下数组可不可以用来储存呢?n<=100000000,数太大了,就算表示 ,也会超时。

 再想是不是有循环节,但是前四位的是跟后面几位有关系的(可以产生进位),不能只存前四位;

最后想想:Fibonacci数肯定有公式可以求得公式如下:

 
具体一点的可以读一下百度的一篇文章:
http://jingyan.baidu.com/article/f3e34a128e48acf5ea65355b.html
代码:
/**************
Author:jiabeimuwei
Times:16ms
Sources:NYOJ461
**************/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
using namespace std;
//#include<windows.h>
//#include<conio.h>
#define max(a,b) a>b?a:b
#define min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))
#define malloc(sb) (sb *)malloc(sizeof(sb))
#define EPS             1e-8
#define DINF            1e15
#define MAXN            100050
#define MOD             1000000007
int fib(int n)
{
    if (n<=1) return n;
    return fib(n-1)+fib(n-2);
}
int main()
{
    int n,m,i,j;
    double a=(1.0+sqrt(5.0))/2.0;
    while(scanf("%d",&n)!=EOF)
    {
        if(n<=20)
            printf("%d\n",fib(n));
        else
        {
            double count=-0.5*log10(5.0)+n*log10(a);
            int c;
            count=count-floor(count);
            count=pow(10,count);
            c=(int)(count*1000);
            printf("%d\n",c);
        }
    }
    return 0;
}

学长的比较好的代码::
#include<stdio.h>
#include<math.h>
int f[]= {0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765};
int main()
{
    int n,i,num;
    double a=-0.5*log(5)/log(10),b=log( ( 1+sqrt(5.0) )/2 )/log(10);//c=( 1-sqrt(5.0) )/( 1+sqrt(5.0) );
    double ans;
    while(scanf("%d",&n)!=EOF)
    {
        if(n>=21)
        {
            ans=a+n*b;//+log(1-pow(c,n));
            ans=ans-(int)ans;
            num=pow(10,ans)*1000;
        }
        else num=f[n];
        printf("%d\n",num);
    }
    return 0;
}



 

你可能感兴趣的:(数论,C语言,nyoj)