SHUOJ Fibonacci数列

来源:互联网 发布:软件交易会 编辑:程序博客网 时间:2024/05/16 14:40

描述

Fibonacci数列的定义如下:

f(0) = 0

f(1) = 1

f(n + 1) = f(n) + f(n - 1)

给定一系列整数,判断每个数是否在Fibonacci序列中。

输入
有多行数据 ,每行上有一个非负整数n, 0 <= n <= 2147483647。 输入以-1结束,不必判定该数是否是Fibonacci数。

输出
对输入要求中的每个整数n,判定是否在Fibonacci数 列中。如果它在,那么输出它在fibonacci数列中第一个出现的序号(从0开始),否则输出”Not a Fibonacci number.”,对-1不作处理。

我的想法

这道题给的数据太水了,算0在内2971215073也只是第48项而已(已经超出题目数据范围),所以就让我们来一次酣畅淋漓的暴力破解吧!

代码

#include<stdio.h>void find(int goal);//Fibonacci数表long long a[48]={0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,                     10946,17711,28657,46368,75025,121393,196418,317811,514229,832040,                     1346269,2178309,3524578,5702887,9227465,14930352,24157817,39088169,63245986,102334155,                     165580141,267914296,433494437,701408733,1134903170,1836311903,2971215073};int main(){    long long n;    while(scanf("%lld",&n)==1)    {        if(n==-1) break;        else if(n!=-1&&n!=1)           find(n);        else if(n==1)            printf("1\n");    }    return 0;}void find(int goal)//二分查找{    int low=0,high=47;    int middle;    while(low<=high)    {        middle=(high+low)/2;        if(goal==a[middle])        {            printf("%d\n",middle);break;        }        else if(goal<a[middle])        {            high=middle-1;        }        else if(goal>a[middle])        {            low=middle+1;        }    }    if(goal!=a[middle])        printf("Not a Fibonacci number.\n");}

其他

当然还有更文明的办法,Fibonacci第n项(非0项)可以用公式计算
这里写图片描述
进而反解出项数n。
之所以不用递归是因为测试数据比较多,递归中重复的计算时间很让人心焦啊!