我正在解决一个问题,即在不使用在线裁判的递归的情况下打印第n个Fibonacci术语。 它表示打印输出模数为1000000007。
#include <stdio.h>
long long int fib(int q)
{
if(q==1||q==2)return 1;
else{
long long int x=1,y=1,z;
register int i;
for(i=0;i<q-2;i++){
z=x+y;
y=x;
x=z;
}
return z%1000000007;}
}
int main(void) {
int t,i;
scanf("%d",&t);
for(i=0;i<t;i++)
{
int q;
scanf("%d",&q);
printf("%lld\n",fib(q));
}
return 0;
}
代码在代码块中工作正常,但它显示错误的答案(也没有显示输出)。
答案 0 :(得分:0)
第一件事:
错误是模数。 您需要提供以 1000000007 为模的答案。 并且斐波那那序列生长得非常快。
然后可能发生的是long long类型溢出。
您必须在算法的每一步计算模数。
让我们看看以下示例:
在总结时我们总是得到调制
带有该更改的最终代码如下所示:
long long int fib(int q) {
if(q==1||q==2) {
return 1;
} else {
long long int x=1,y=1,z;
register int i;
for(i=0;i<q-2;i++){
z=(x+y) % 1000000007;
y=x;
x=z;
}
return z % 1000000007;
}
}