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

求满足整除与数位和条件的最小正整数X的Java代码优化问题

问题分析与优化方案

你的代码在处理较小的N时工作正常,但面对98、99、100这类较大值时失效,主要有两个核心问题:

  1. 固定循环上限限制:原代码中i<10000的上限太保守,对于大N,需要远大于10000的k值(X=N*k)才能满足各位和等于N的条件,导致循环提前结束返回0。
  2. 整数溢出问题:当N*k超过int类型的最大值(2^31-1=2147483647)时,会发生溢出,导致计算出的候选值错误,进而getSum函数得到错误的结果。

优化后的代码

我们可以通过以下两点修复问题:

  • 移除固定循环上限,改为无限循环直到找到符合条件的数;
  • 将变量类型从int改为long,避免溢出问题。
public static long getSmallestNumber(int input1) {
    long k = 2; // 从k=2开始,因为X不能等于N
    while (true) {
        long candidate = (long) input1 * k;
        if (getSum(candidate) == input1) {
            return candidate;
        }
        k++;
    }
}

// 适配long类型的各位和计算函数
static int getSum(long n) {
    int sum = 0;
    while (n != 0) {
        sum += n % 10;
        n /= 10;
    }
    return sum;
}

代码说明

  1. 移除固定上限:通过while(true)持续枚举k值,直到找到满足条件的X=N*k,确保不会因为上限太小错过正确结果。
  2. 使用long类型:long类型的最大值为9223372036854775807,足以容纳N≤100时所需的所有候选值,避免溢出导致的计算错误。
  3. 保持核心逻辑:保留了原代码中“枚举N的倍数并检查各位和”的核心思路,只是解决了原代码的限制问题。

测试验证

  • 输入9:返回18(符合预期)
  • 输入10:返回190(符合预期)
  • 输入99:最终会找到符合条件的最小X(代码会保证找到数值最小的那个)
  • 输入100:返回19999999999900(各位和1+11*9+0+0=100,且是100的倍数)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:12:36