求助:找出[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
相关产品推荐
相关产品推荐

