1. 程式人生 > >hdu1568 Fibonacci---前4位

hdu1568 Fibonacci---前4位

斐波那契數 acc using mage esp pac 由於 urn gpo

題目鏈接:

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

題目大意:

求斐波那契數列第i項的前四位。i<1e8

思路:

由於數據範圍大,不可能打表,所以應該從通項公式入手:

通項公式:

技術分享圖片

我們稍微將公式轉化一下,再取個對數。

技術分享圖片

技術分享圖片

而我們要取Fibonacci數的前4位,可以通過計算以10為底的對數,原理與HDU 1060 Leftmost Digit是一樣的

另外,需要提及的一點是前20項Fibonacci數需要自己計算,一方面是因為Fibonacci數未滿4位,更重要的一點是Fibonacci數較小時,公式的精確度不高,所以需要打表前20項。

 1 #include<iostream>
 2
#include<algorithm> 3 #include<cmath> 4 using namespace std; 5 typedef long long ll; 6 const int maxn = 1e5; 7 ll a[25]; 8 int main() 9 { 10 int n; 11 a[1] = 1; 12 for(int i = 2; i <= 20; i++)a[i] = a[i - 1] + a[i - 2]; 13 while(cin >> n) 14 { 15 if
(n < 21) 16 { 17 cout<<a[n]<<endl; 18 } 19 else 20 { 21 double s = log10(1.0/sqrt(5.0)) + n * 1.0 * log10((1 + sqrt(5.0))/2); 22 s -= (int)s; 23 s = pow(10, s); 24 while(s < 1000)s *= 10; 25 cout<<(int
)(s)<<endl; 26 } 27 } 28 return 0; 29 }

hdu1568 Fibonacci---前4位