给定long型数值求最接近阶乘对应整数的Java代码错误排查求助
问题分析
原代码的逻辑完全偏离需求,根本没有实现“计算阶乘并比较接近程度”的核心逻辑,具体问题如下:
- 未正确计算阶乘:代码里的
factorial只是从1开始递增的整数,并没有通过累乘得到阶乘值,sum = number / factorial的计算和阶乘判断毫无关联。 - 循环条件错误:
while (number <= sum)的逻辑完全不符合需求,以输入100为例:- 第一次循环:
sum = 100/1=100,factorial变为2,判断100<=100成立,继续循环。 - 第二次循环:
sum=100/2=50,factorial变为3,判断100<=50不成立,退出循环输出3,这显然和预期结果不符。
- 第一次循环:
修正思路与代码
正确的实现逻辑应该是:
- 逐步计算递增的阶乘值,直到阶乘超过输入数,此时得到两个候选阶乘:刚好小于等于输入数的
prevFact(对应n-1),和刚超过输入数的currFact(对应n)。 - 比较输入数与这两个阶乘的差值绝对值,返回差值更小的那个对应的n;若差值相等,默认返回较小的n(可根据需求调整)。
修正后的代码:
import java.util.Scanner; class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); long number = scanner.nextLong(); // 处理特殊情况:输入小于等于1时,1!最接近 if (number <= 1) { System.out.println(1); return; } long prevFact = 1; // 初始为1! long currFact = 1; int n = 1; // 找到第一个大于输入数的阶乘,同时处理long溢出情况 while (currFact <= number && currFact > 0) { prevFact = currFact; n++; currFact *= n; } // 计算两个阶乘与输入数的差距,溢出时默认取前一个阶乘 long diffPrev = number - prevFact; long diffCurr = currFact > 0 ? currFact - number : Long.MAX_VALUE; System.out.println(diffPrev <= diffCurr ? n - 1 : n); } }
测试输入100时,代码会计算出4! =24、5! =120,对比100与两者的差值(76 vs 20),最终返回5,符合预期。
内容的提问来源于stack exchange,提问作者Ricardo Ferreira
相关产品推荐
相关产品推荐

