java - 为什么斐波那契数列的偶数位置之和给出否定答案?
问题描述
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
解决方案
在 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。
推荐阅读
- swift - NSEvent.addLocalMonitorForEvents 在没有窗口的应用程序开发中不起作用(构建 macOS 菜单栏应用程序)
- python - 在Python中通过某个关键字将文件拆分为列表
- java - 数组删除或删除操作不起作用
- c# - 他是如何在不定义 txtTitle 和 txtMessage 的情况下使他的代码工作的?
- android - 如何在 Androidx Compose Material 中删除 TextField 的指示线?
- ruby-on-rails - 如何使用 Net::SFTP (Ruby) 创建嵌套目录
- python - 如何对这个循环数组过程进行矢量化或以其他方式加速?
- amazon-web-services - AWS 将子域重定向到 S3 中的子文件夹
- latex - Rmarkdown:markdown 语法中包含的交叉引用图像
- refresh - 如何取消选中 React 中的单选按钮?