求解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
相关产品推荐
相关产品推荐

