这题当时没做出来,主要不知道怎么处理这么大的数,用字符串吧太麻烦,用java又没自信,所以用c++搞了半天不对,看下官方给的代码吧。
#include <bits/stdc++.h>
using namespace std;
unsigned long long a[105]; //通过unsigned写法让long long存储范围再大一倍;
unsigned long long b[105];
int main()
{
a[1] = 1;
a[2] = 2;
unsigned long long b = 1, c = 1;
for(int i = 3; i <= 91; ++i) //求斐波那契数列前N项和
{
a[i] = a[i - 1] + b + c;
b = c;
c = a[i] - a[i - 1];
}
int T;
scanf("%d", &T);
while(T--)
{
unsigned long long n;
scanf("%llu", &n);
if (n == 0)
{
printf("0\n");
continue;
}
int ans = 0;
for(int i = 1; i <= 91; ++i) //通过循环不断刷新ans的值,从而找到可达到的最大项
{
if(a[i] <= n)
ans = i;
}
printf("%d\n", ans);
}
return 0;
}
这是种较为偷懒的方法,也可以其他方法,欢迎教育本rookie!至于循环为什么到91,应该是因为前91项和已经大的离谱了吧,我是这么想的。