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

给定long型数值求最接近阶乘对应整数的Java代码错误排查求助

问题分析

原代码的逻辑完全偏离需求,根本没有实现“计算阶乘并比较接近程度”的核心逻辑,具体问题如下:

  • 未正确计算阶乘:代码里的factorial只是从1开始递增的整数,并没有通过累乘得到阶乘值,sum = number / factorial的计算和阶乘判断毫无关联。
  • 循环条件错误:while (number <= sum)的逻辑完全不符合需求,以输入100为例:
    1. 第一次循环:sum = 100/1=100,factorial变为2,判断100<=100成立,继续循环。
    2. 第二次循环: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:36:07