斐波那契数判断及偶数斐波那契数求和函数的实现与代码调试
问题分析与代码修正
咱们一步步拆解你代码里的问题,然后修正成符合需求的版本哈:
你的代码存在的核心问题
- 硬编码输入值:你直接把
n=22写死了,没法处理不同的输入参数,完全不符合“以数字作为输入”的要求 - 数组越界异常:循环从
i=0开始,执行arr[i] = arr[i-1] + arr[i-2]时会访问arr[-1]和arr[-2],这会直接抛出数组越界错误,而且初始的arr[0]和arr[1]会被覆盖,逻辑完全混乱 - 逻辑分支错误:就算找到了等于输入的斐波那契数,代码还是会继续执行后面的求和打印,导致重复输出;同时循环结束条件也不对,没法完整生成到目标范围内的斐波那契数
- 求和范围错误:你的代码把0也算进了总和,但根据测试用例输入20输出10(2+8=10),说明0不应该被计入
修正后的完整代码
我们可以不用数组存储所有斐波那契数,用几个变量迭代就能完成,既节省空间又避免越界问题:
public class FibonacciProcessor { public static void handleInput(int input) { // 先判断输入是否是斐波那契数 if (isFibonacciNumber(input)) { System.out.println(input); return; } // 不是的话,计算所有小于输入的偶数斐波那契数之和 int evenSum = 0; int prevPrev = 0; int prev = 1; while (prev < input) { int current = prevPrev + prev; // 只累加小于输入的偶数斐波那契数 if (current < input && current % 2 == 0) { evenSum += current; } prevPrev = prev; prev = current; } System.out.println(evenSum); } // 辅助方法:利用斐波那契数的数学性质判断是否为斐波那契数 private static boolean isFibonacciNumber(int num) { if (num < 0) { return false; } // 斐波那契数的性质:5n²+4 或 5n²-4 必为完全平方数 long val1 = 5L * num * num + 4; long val2 = 5L * num * num - 4; int sqrt1 = (int) Math.sqrt(val1); int sqrt2 = (int) Math.sqrt(val2); return (sqrt1 * sqrt1 == val1) || (sqrt2 * sqrt2 == val2); } public static void main(String[] args) { // 测试用例验证 handleInput(20); // 输出10 handleInput(21); // 输出21 } }
代码说明
- 输入通用性:
handleInput方法接收一个int类型的输入参数,完全符合需求 - 高效判断斐波那契数:
isFibonacciNumber方法利用数学性质判断,比生成数列更高效,尤其适合大数字 - 迭代求和逻辑:用
prevPrev、prev、current三个变量迭代生成斐波那契数,只在数小于输入且为偶数时累加,避免了数组越界问题 - 符合测试用例:输入20时,小于20的偶数斐波那契数是2和8,和为10;输入21时,判断是斐波那契数,直接输出21,完全匹配测试要求
内容的提问来源于stack exchange,提问作者Rohiit Kadam
相关产品推荐
相关产品推荐

