You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求解n个斐波那契数之和时遇ArrayIndexOutOfBoundsException错误求助

解决数组越界错误并正确计算斐波那契数列前n项和

首先,咱们来拆解你遇到的java.lang.ArrayIndexOutOfBoundsException问题:

  • 你创建了长度为n的数组f,数组的合法索引范围是0到n-1,但代码里尝试访问f[n]——这直接超出了数组边界,比如输入10时,数组最大索引是9,访问f[10]自然会触发报错。
  • 另外,你的方法逻辑和需求不匹配:你现在的代码是想取第n个斐波那契数,但实际要的是前n个斐波那契数的和,所以需要累加数组里的所有元素,而非返回单个元素。

修正后的代码方案

这里提供两种实现思路,一种基于你原有的数组逻辑修改,另一种利用数学性质优化性能:

方案1:基于数组的修正版本

import java.util.*;
public class FibonacciSumLastDigit {
    private static int getFibonacciSum(int n) {
        // 处理n=0的特殊输入
        if (n == 0) return 0;
        // 创建数组存储前n个斐波那契数
        int[] f = new int[n];
        f[0] = 0;
        // 当n>=2时才初始化第二个元素
        if (n >= 2) {
            f[1] = 1;
        }
        // 生成后续斐波那契数
        for (int i = 2; i < n; i++) {
            f[i] = f[i - 1] + f[i - 2];
        }
        // 累加所有元素得到总和
        int sum = 0;
        for (int num : f) {
            sum += num;
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int s = getFibonacciSum(n);
        System.out.println(s);
    }
}

方案2:利用数学性质优化(无需数组)

斐波那契数列有个实用性质:前n个斐波那契数的和等于第n+2个斐波那契数减1(基于你的定义:F(0)=0,F(1)=1,F(2)=1,F(3)=2...)。比如:

  • 前1项和:0 = F(3)-1 = 1-1=0
  • 前3项和:0+1+1=2 = F(5)-1=3-1=2

利用这个性质可以省去数组,节省内存空间:

import java.util.*;
public class FibonacciSumLastDigit {
    private static int getFibonacciSum(int n) {
        if (n == 0) return 0;
        // 迭代计算第n+2个斐波那契数
        int prevPrev = 0; // F(0)
        int prev = 1;     // F(1)
        for (int i = 2; i <= n + 1; i++) {
            int current = prevPrev + prev;
            prevPrev = prev;
            prev = current;
        }
        // 根据性质返回总和
        return prev - 1;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int s = getFibonacciSum(n);
        System.out.println(s);
    }
}

额外小提示

从类名FibonacciSumLastDigit推测,你可能只需要总和的最后一位数字。如果是这样,可以在计算时对10取模,避免数值过大溢出,比如把f[i] = f[i-1] + f[i-2]改成f[i] = (f[i-1] + f[i-2]) % 10,或者在优化方案里对current取模。

内容的提问来源于stack exchange,提问作者Nirzar Bhatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:42:50