SHUOJ Fibonacci数列

描述

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。
之所以不用递归是因为测试数据比较多,递归中重复的计算时间很让人心焦啊!

猜你喜欢

转载自blog.csdn.net/waveviewer/article/details/76860410