1. 程式人生 > >hdu 1568(Fibonacci)(就是大數的斐波那契公式)

hdu 1568(Fibonacci)(就是大數的斐波那契公式)

Fibonacci

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3569    Accepted Submission(s): 1627

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說的是否正確。
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;
}