码迷,mamicode.com
首页 > 其他好文 > 详细

HDU3117 Fibonacci Numbers【数学】

时间:2015-02-08 23:17:38      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=3117


题目大意:

给你一个整数N(0 <= N <= 10^8),求斐波那契数列第N项F[N]的前四位数字和末尾四位数字。


思路:

斐波那契数列是一个很大的数,直接暴力枚举显然不科学。先考虑末尾4位是否有循环节,写个

程序发现循环节是15000,直接用数组存储前15000的斐波那契数列的末尾4位。至于斐波那契

数列的前4位。通过计算得出N >= 40之后,F[N]就大于8位数了。对于N < 40的部分可以直接

输出结果,对于N >= 40的部分,考虑公式 F[N] =(1/√5) * ( ((1+√5)/2)^n - ((1-√5)/2)^n )。

设F[N]可表示为t * 10^k(t为一个小数),那么对F[N] = t * 10^k两边分别取对数log10,得到:

log10(F[N]) = log10(t) + k 。log10(t) = log10(F[N]) - k,因为t肯定是小于10的小数,所以,

log10(t) < 1,而且k为整数,那么log10(t)的值就是log10(F[N])去掉整数部分的小数部分。

用pow(10.0,log10(t))求出t。将t*1000取整数部分就得到了F[N]的前4位。

还有一点,求F[N] = (1/√5) * ( ((1+√5)/2)^n - ((1-√5)/2)^n )的时候,因为N>=40的时候,

((1-√5)/2)^n已经是一个非常小的小数(小数点后10位左右),所以可以直接忽略。这样子,

F[N] ≈ (1/√5) * ((1+√5)/2)^n。log10(F[N])化简为:1/sqrt(5.0) + N*log10(1+(sqrt(5.0))/2.0)。


AC代码:


HDU3117 Fibonacci Numbers【数学】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/43647135

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!