巧用数学公式,两边去对数来算。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
int fib[21] = {0, 1, 1};
for(int i = 3; i < 21; i++)
fib[i] = fib[i - 1] + fib[i - 2];
while(cin >> n)
{
if(n <= 20)
cout << fib[n] << endl;
else
{
double ans = -0.5 * log10(5.0) + n * log10((1.0 + sqrt(5)) / 2.0);
ans = ans - floor(ans);
ans = pow(10, ans);
cout << (int)(ans * 1000) << endl;
}
}
return 0;
}