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