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。
之所以不用递归是因为测试数据比较多,递归中重复的计算时间很让人心焦啊!
阅读全文
0 0
- SHUOJ Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- Fibonacci数列
- fibonacci数列
- E
- Hive 建表结合正则表达式的案例
- python type函数和isintance函数 获取数据的数据类型
- 学习笔记—HTML基础
- YII2(一)用YII2创建、迁移数据表 migrations
- SHUOJ Fibonacci数列
- 【noip 2015】联合权值
- 类的大小(sizeof)
- css四种导入方式
- 使用Makefile终端参数实现跨平台编译控制
- [LeetCode] 14. Longest Common Prefix
- 【C++】运算符重载
- c++ 构造函数
- 数据库与文件进行数据存取的区别