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

求助:找出[a,b]内阶数以偶数开头的数的代码存在Bug

阶数以偶数开头的数字收集代码Bug排查

问题描述

  • 需求:收集区间[a,b](1 ≤ a,b ≤ 100)中所有阶数以偶数开头的数字。示例:当a=1、b=10时,结果为2 3 4 8,对应阶数分别为2、6、24、40320,均以偶数开头。
  • 问题:编写的Java代码在编程挑战中存在6个隐藏测试用例失败,无法定位Bug。

原始代码

List<Integer> process(int a, int b) {
    long base = i;
    for(int i=1; i<=a; i++) base *= i;
    
    if(even(base)) list.add(a);
    
    for(int i=a+1; i<=b; i++) {
        base *= i;
        if(even(base)) list.add(i);
    }
    return list;
}

boolean even(long k) {
    int z = ("" + k).charAt(0) - '0';
    return z % 2 == 0;
}

存在的Bug分析

  • 未定义变量错误:long base = i;中的i未提前声明,直接导致编译失败。
  • 未初始化集合:方法中使用list.add(a)但未声明并初始化List<Integer> list,编译无法通过。
  • long类型溢出:当计算到21!及以上时,long类型的最大值(9223372036854775807)会被突破,数值溢出后得到错误的阶乘结果,进而影响首数字的判断。
  • 初始值错误:阶乘的初始值应为1,而非未定义的i,正确的初始计算应从base = 1开始,再循环乘以1到a的数。

修正后的代码

import java.util.ArrayList;
import java.util.List;

public class FactorialStartsWithEven {
    List<Integer> process(int a, int b) {
        List<Integer> list = new ArrayList<>();
        // 使用BigDecimal处理大数值阶乘,避免溢出
        java.math.BigDecimal base = java.math.BigDecimal.ONE;
        for (int i = 1; i <= a; i++) {
            base = base.multiply(java.math.BigDecimal.valueOf(i));
        }
        if (even(base)) {
            list.add(a);
        }
        for (int i = a + 1; i <= b; i++) {
            base = base.multiply(java.math.BigDecimal.valueOf(i));
            if (even(base)) {
                list.add(i);
            }
        }
        return list;
    }

    boolean even(java.math.BigDecimal k) {
        // 将BigDecimal转为字符串,取首字符判断是否为偶数
        String str = k.toPlainString();
        int z = str.charAt(0) - '0';
        return z % 2 == 0;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:15:41