首页 > 解决方案 > 为什么斐波那契数列的偶数位置之和给出否定答案?

问题描述

Java中的约束,应该使用数组,当位置为偶数且a[i]时应计算总和


import java.util.*;
class abc
{
  public static void main(String[] args)
 {
    Scanner sc=new Scanner(System.in);
    int sum=0;
      int n=sc.nextInt();
      int a[]=new int[n];
      a[0]=1;
      a[1]=2;
      for(int i=2;i<n;i++)
      {
        a[i]=a[i-1]+a[i-2];
        if(a[i]<n && i%2==0)
        sum=sum+a[i];
      }
      System.out.println(sum);
  }
}

输入- 50 输出- -298632831

标签: javaarrayssumruntime-errorfibonacci

解决方案


在 javaint中,长度为4 个字节,范围为-2,147,483,648 到 2,147,483, 647。所以在你的情况下int sum是溢出的。因为当 n = 50 febonacci 系列时,结果为12586269025。这超出了int.

因此,您应该使用 along来保存sum. 这是8 个字节,限制为-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

即使您需要使用长数组,因为您在将值分配给数组元素之后执行操作。所以更新的代码应该是:

long sum = 0;
    final long a[] = new long[50];
    a[0] = 1L;
    a[1] = 2L;
    final int n = 50;
    for (int i = 2; i < n; i++) {
      a[i] = a[i - 1] + a[i - 2];
      if (a[i] < n && i % 2 == 0) {
        sum = sum + a[i];
      }
    }
    System.out.println(sum);

注意(如 Mihir 所建议的):long也有限制,所以在n = 92之前,它会正常工作。如果你可以有 n > 92 你需要使用BigInteger. 这也有进一步的限制。因此,请在您的代码中考虑这些限制。

BigInteger 必须支持 -2Integer.MAX_VALUE(不包含)到 +2Integer.MAX_VALUE(不包含)范围内的值,并且可能支持该范围之外的值。

实施说明:当结果超出 -2Integer.MAX_VALUE(不包含)到 +2Integer.MAX_VALUE(不包含)的支持范围时,BigInteger 构造函数和操作会抛出 ArithmeticException。


推荐阅读