hdu 1568 Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568

参考别人的思路过的==|||,当n比较大的时候,使用如图所示的通项公式:

先化简,使用极限考虑,n很大的情况消去一个项:[1-(1-?5)^n/(1+?5)^n],然后方程两边取对数。

得到log10(fn) = n*log10((1+?5)/2)-1/2*log10(5)

ac代码:

#include<iostream>

#include<cstdio>

#include<cmath>

using namespace std;

int a[100];

void init(){

	a[0]=0;

	a[1]=1;

    for(int i=2;i<21;i++){

    	a[i]=a[i-1]+a[i-2];

    }

}



int main(){

	init();

	int n;

	while(scanf("%d",&n)==1){

		if(n<21){

			printf("%d\n",a[n]);

			continue;

		}

		double log10f = n*log((1+sqrt(5))/2)/log(10)-0.5*log(5)/log(10);

		double res = pow(10,log10f-floor(log10f));

		while(res<1000){

			res*=10;

		}

		printf("%d\n",(int)res);

	}

}

 

你可能感兴趣的:(fibonacci)