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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:35:53