您的位置:首页 > 其它

HDU 1568 犀利的fibonacci数列(log 科学记数法)

2017-01-16 17:04 253 查看

思路:

1)前20项没超过10000,直接递推出

2)首先我们知道fibonacci的通项公式:



然而这个得出来的数太大了。。。

有一种很巧妙的思路:

我们想要求出某个很大的数的前几位,比如求斐波那契数列第40项102334155的前6位,我们可以把

102334155化成1.02334155*10^8,然后把1.02334155这个数乘100000取整就可以了。这种方法可以求一个数的前任何位。





所以先对fn取对数,去掉整数部分(这里的整数部分是之后的幂所以去掉也不会影响结果)然后去其小数部分,得到temp,然后需要几位就去取ans = pow ( 10,temp )的几位小数就行了。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
typedef long long int li;
using namespace std;

int f[25];

int main(){
int n;
f[0] = 0;
f[1] = f[2] = 1;
for(int i = 3;i<=23;i++){
f[i] = f[i-1] + f[i-2];
}
while(~scanf("%d",&n)){
if(n < 21)
printf("%d\n",f
);
else{
double gw = sqrt(5);
double temp = log10(1.0/gw) + n * log10((1+gw)/2.0);
temp = temp - (int)temp;
double ans = pow(10,temp);
while(ans < 1000)
ans *= 10;
printf("%d\n",(int)ans);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: