在没有递归的情况下打印第n个fibonnaci数

时间:2017-10-22 11:07:16

标签: fibonacci

我正在解决一个问题,即在不使用在线裁判的递归的情况下打印第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;
}

代码在代码块中工作正常,但它显示错误的答案(也没有显示输出)。

1 个答案:

答案 0 :(得分:0)

第一件事:

  • 请将您的代码缩进至可读性,因为它可以帮助您使用,为您提供更好的答案,让人们轻松理解代码

错误是模数。 您需要提供以 1000000007 为模的答案。 并且斐波那那序列生长得非常快。

然后可能发生的是long long类型溢出。

您必须在算法的每一步计算模数。

让我们看看以下示例:

  • x和y非常大但仍适合长长型
  • x + y不适合长长的
  • 然后x + y是一些负值,因为(溢出发生)
  • 我们用负数来调节fibonnaci序列!

在总结时我们总是得到调制

  • x + y%1000000007
  • 总是小于1000000007,所以总和总是适合长长的
  • 所以我们没有溢出!

带有该更改的最终代码如下所示:

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;
  }
}