此题一看头就大,不知从何下手。通项公式是很容易推出来的,不过是两项幂的差,这个会有精度损失的。
但是仔细观察一下会发现,其实前面一项是大于1的,幂越大数越大。而后面一项小于1,幂越大则越小,当
n足够大时,那么后面就几乎对整个数无影响,可以忽略。我们只需要关心前面几项符不符合即可。发现都符合。
那么直接忽略掉,如同斯特林数一样的巧妙。
f[n]=1/sqrt(5)*{[(1+sqrt(5))/2]^n-[(1-sqrt(5))/2]^n};
下面是简单的代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double C = sqrt(5);
/*
* 此题就是求第n个飞扑纳妾数列有多少位
*/
int main() {
int T;
double n;
while (scanf("%d", &T) != EOF) {
while (T--) {
scanf("%lf", &n);
double result = n * log10(0.5 + 0.5 * C) - log10(C);
printf("%d\n", int(result) + 1);
}
}
return 0;
}