如果爆掉数据范围就取对数进行运算,和之前做的大一选拔赛D题处理方法差不多;
log10 (F(n)) = log10 (1/sqrt(5)) + n * log10 ((1 + sqrt(5)) / 2) + ……
注意到……部分约等于0,误差较小,因此舍去;
因此,log10 (F(n)) = log10 (1/sqrt(5)) + n * log10 ((1 + sqrt(5)) / 2)
log10(123456) = log10(1.23456) + 5;
只取小数部分即可,最后乘上1000,输出前4位;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long double le;
int f[25];
int n;
le ans;
void solve()
{
f[0] = 0;
f[1] = 1;
for(int i = 2;i <= 19 ;i ++) f[i] = f[i - 1] + f[i - 2];
while(cin>>n)
{
if(n <= 19) printf("%d\n",f[n]);
else
{
ans = log10(1 / sqrt(5)) + n * log10((1 + sqrt(5) ) / 2);
ans -= (int)ans;
ans = pow(10,ans) * 1000;
printf("%d\n",(int)ans);
}
}
return;
}
int main()
{
solve();
return 0;
}