hdu 1568(Fibonacci)(就是大數的斐波那契公式)
阿新 • • 發佈:2019-02-11
Fibonacci
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3569 Accepted Submission(s): 1627Problem 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說的是否正確。
Input 輸入若干數字n(0 <= n <= 100000000),每個數字一行。讀到檔案尾。
Output 輸出f[n]的前4個數字(若不足4個數字,就全部輸出)。
Sample Input 0 1 2 3 4 5 35 36 37 38 39 40
Sample Output 0 1 1 2 3 5 9227 1493 2415 3908 6324 1023
Author daringQQ
Source 斐波那契的公式,求解過程,可以利用公式先求出其小數部分,然後求其的次方,得到的數值,進行乘十運算,直到變成四位數 程式碼如下:
</pre><pre name="code" class="cpp">//斐波那契數列公式:F(n)=[((1+sqrt(5.0)/2)^n-((1-sqrt(5.0))/2)^n]/sqrt(5.0); //求大數的前幾位數字,可以用公式,先求出小數部分,然後進行 //由於(1-sqrt(5.0))/2的N次方非常小,所以可以忽略。 #include<stdio.h> #include<math.h> int fib[22]; int main() { double num; int n,f,i; fib[0]=0; fib[1]=1; for(i=2;i<=20;i++) fib[i]=fib[i-1]+fib[i-2]; while(~scanf("%d",&n)) { if(n<21)//由於小於20的斐波那契數列小於四位數字,所以可以直接輸出。 { printf("%d\n",fib[n]); continue; } num=n*(log10((1+sqrt(5.0))/2.0))-log10(sqrt(5.0)); num-=(int)num;//得到小數部分 num=pow(10,num);//得到第一位數 while(num<1000) num*=10; f=num;//得到最後的四位數,消除小數部分 printf("%d\n",f); } return 0; }