Java基础:欧拉计划斐波那契偶数项求和问题求助
排查斐波那契偶数项求和代码的问题
你的代码输出错误主要有几个关键问题,我来逐个拆解并给出修正方案:
问题1:循环逻辑完全不符合需求
你用for(int i = 0; i <= 4000000; i++)作为循环终止条件,这是完全错误的。我们需要的是当生成的斐波那契项不超过400万时才继续计算,而不是循环400万+1次。斐波那契数列增长极快,到400万只需要不到30次循环,多余的循环不仅无效,还会因为后续数值溢出产生负数,导致错误的累加。
问题2:int类型导致的整数溢出
Java里int的最大值是2147483647(约21亿),虽然400万比这个值小,但斐波那契数列后期的项会快速接近甚至超过这个最大值,此时int会溢出变成负数。比如当y变成负数后,y % 2 == 0可能为真,会把负数加到sum里,这就是你得到错误结果的核心原因之一。必须改用long类型来存储斐波那契项和求和结果。
问题3:初始值不符合题目定义
题目明确数列从1和2开始,前10项是1, 2, 3, 5, 8...,但你的初始x=0、y=1会生成开头为1, 1, 2, 3...的数列,多了一个额外的1。虽然这不是结果错误的主要原因,但会导致数列开头不符合题目要求,需要修正。
修正后的代码
这里给出两种正确的实现方式,都能得到正确答案4613732:
方式一:用while循环控制终止条件
public class FibonacciEvenSum { public static void main(String[] args) { long x = 1; // 数列第一项 long y = 2; // 数列第二项 long sum = 0; // 只要当前项y不超过400万,就继续计算 while (y <= 4000000) { if (y % 2 == 0) { sum += y; } // 生成下一项 long z = x + y; x = y; y = z; } System.out.println(sum); // 输出正确结果:4613732 } }
方式二:提前判断下一项是否超出范围
public class FibonacciEvenSum { public static void main(String[] args) { long x = 1; long y = 2; long sum = 2; // 初始包含第一个偶数项2 while (true) { long z = x + y; if (z > 4000000) { break; // 超出范围就终止循环 } if (z % 2 == 0) { sum += z; } x = y; y = z; } System.out.println(sum); } }
内容的提问来源于stack exchange,提问作者Mukarram Waqqas
相关产品推荐
相关产品推荐

