HDU 1568 Fibonacci【数学】
来源:互联网 发布:debian 8 切换php版本 编辑:程序博客网 时间:2024/05/22 10:23
Fibonacci
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4288 Accepted Submission(s): 1985
Problem Description
2007年到来了。经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。
(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i>=2))的值全部给背了下来。
接下来,CodeStar决定要考考他,于是每问他一个数字,他就要把答案说出来,不过有的数字太长了。所以规定超过4位的只要说出前4位就可以了,可是CodeStar自己又记不住。于是他决定编写一个程序来测验zouyu说的是否正确。
Input
输入若干数字n(0 <= n <= 100000000),每个数字一行。读到文件尾。
Output
输出f[n]的前4个数字(若不足4个数字,就全部输出)。
Sample Input
012345353637383940
Sample Output
011235922714932415390863241023
借鉴了大神的经验,可参考
http://jingyan.baidu.com/article/f3e34a128e48acf5ea65355b.html
首先看到是100位以上的斐波拉切,不能直接刷表,肯定有特殊方法做,想到通项公式:
1,斐波拉切数列的通项公式:
不过用double只能算到大约第1000个数,而且有效位很低,题目要求最高要求第10万个斐波拉切数的前几位,那么明显不够看了.......
继续想发现:如果可以表示成科学计数法的形式,那么就可以很简单的进行运算了!
这里巧妙利用了对数的运算!(以下 ^ 均为指数运算符号 )
2,给出一个数 n,
n 肯定能写成 n=x*10^m(x 为小于10的数,m为n 的位数减去1,也就是floor(log10(n)))的形式,根据指数和对数互为逆运算,有 n =10^(log10(n)),也就是 n =10^(log10(x*10^m)),
继续化简得到 n = 10^(log10(x)+m),以及10^(log10(x)) * 10^m,
这里的10^m 只决定n 的位数,10^(log10(x)) 这部分(值为x)是才决定n 的每一位是多少,明白了对数这样运算的性质,下面就是直接把 1 中的公式代入这样的性质运算了!
对于 1中的公式,因为最后一项减去的数,其实只是对精确数字的修正,并不影响前几位的准确性(如果结果比较大的时候),那么为了运算方便,在特定时候直接略去了.......
接下来是代码:
#include<stdio.h>#include<math.h>double slove(double x){ double a=sqrt(5.0); if(x<21)//这个21 是图个方便,直接利用了大神的战果... { return 1.0/a*(pow((1.0+a)/2.0,x)-pow((1.0-a)/2.0,x));//直接上公式 } double y=log10(1.0/a)+x*log10((1.0+a)/2.0);//按着上面的推导过程,最好自己推导一下 y-=(int)y;//只留小数部分 return (int)(pow(10.0,y)*1000);}int main(){ double n; //freopen("shuju.txt","r",stdin); while(~scanf("%lf",&n)) { printf("%.0lf\n",(slove(n))); } return 0;}
ps:浮点数的精度控制,真心不知道怎么控制精度了...纠结了一会...
0 0
- HDU 1568 Fibonacci【数学】
- 【HDU 1568 Fibonacci】+ 数学
- HDU 1568 Fibonacci(数学 递推式)
- HDU 1568 Fibonacci (数学)
- HDUoj 1568 Fibonacci ( 数学
- HDU 5018 Revenge of Fibonacci(数学)
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- Fibonacci Hdu 1568
- HDU 1568 - Fibonacci
- HDU-1568 Fibonacci
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- HDU 1568 Fibonacci
- hdu 1568 Fibonacci
- Hdu 1568 Fibonacci
- HDU 1568 Fibonacci
- UIImage渲染颜色
- 欢迎使用CSDN-markdown编辑器
- Handlebars.js 模板引擎
- memcached—协议
- 自定义ImageView实现地图(一)
- HDU 1568 Fibonacci【数学】
- hdoj1049
- Android RecyclerView的使用
- git rebase 后找回消失的commit
- <LeetCode OJ> 328. Odd Even Linked List
- 关于Android Studio如何导入library project
- ♥Vijos 1242-邮局问题【经典DP】
- UIWebView的前进和后退功能
- 人工智能-搜索算法