【问题标题】:Why is the sum of even position of fibonacci series giving aswer as negative answer?为什么斐波那契数列的偶数位置之和给出否定答案?
【发布时间】:2019-09-13 18:48:06
【问题描述】:

java中的constraint,应该使用数组,当position为偶数且a[i]时计算sum


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

【问题讨论】:

  • 看起来你正在溢出 int 类型。

标签: java arrays sum runtime-error fibonacci


【解决方案1】:

Fib(50) = 12_586_269_025(例如参见here

Java,最大整数:2_147_483_647(转到there

简而言之:使用 long 类型,当然还有:

  • 学会正确猜测结果的“大小”
  • 然后了解类型的约束条件,例如它们的最大值

换句话说,真正的答案是:计算中的一切都是有限度的。理解它们真的很重要。

【讨论】:

  • 我使用了一个 if 条件,只有当 a[i] 为偶数且小于 n 时,我才会计算总和。如果我输入 50,它应该只有 2 8 34 的总和吧?
  • 我的问题不仅仅是斐波那契,它是斐波那契数列的偶数位置的总和,这是一个带有我提到的约束条件的问题。有人告诉我使用数组。我仍然无法理解 if 条件似乎“不起作用”的原因。不过感谢您的帮助。还有@GhostCat,我在提问的最初几天没有回应,因为我家里有人去世了,那时我没有使用互联网。以为你很粗鲁,但后来我读了你的简历,所以没关系。
  • 很抱歉听到这个消息。我不是故意粗鲁的。这是一种太常见的模式:人们留下可疑的内容,然后走开。当这种情况发生在你身上 10、20、50 次时,你可能有时会发脾气。对此深表歉意,并祝您一切顺利。
【解决方案2】:

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

因此,您应该使用long 来保存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(独占)并且可能支持值 超出这个范围。

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

【讨论】:

  • 我建议推荐类似 BigInteger 而不是 long 的东西,因为 long 也会在第 92 个斐波那契数附近溢出。
  • 我使用了一个 if 条件,只有当 a[i] 为偶数且小于 n 时,我才会计算总和。如果我输入 50,它应该只有 2 8 34 对吗?为什么我的 if 条件似乎不起作用,如果您解释一下这将非常有帮助。
  • 是位置2、4、6对应的3、8、21之和。
猜你喜欢
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
  • 2011-02-04
  • 2015-11-12
  • 2016-04-07
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多