求满足整除与数位和条件的最小正整数X的Java代码优化问题
问题分析与优化方案
你的代码在处理较小的N时工作正常,但面对98、99、100这类较大值时失效,主要有两个核心问题:
- 固定循环上限限制:原代码中
i<10000的上限太保守,对于大N,需要远大于10000的k值(X=N*k)才能满足各位和等于N的条件,导致循环提前结束返回0。 - 整数溢出问题:当
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; }
代码说明
- 移除固定上限:通过
while(true)持续枚举k值,直到找到满足条件的X=N*k,确保不会因为上限太小错过正确结果。 - 使用long类型:
long类型的最大值为9223372036854775807,足以容纳N≤100时所需的所有候选值,避免溢出导致的计算错误。 - 保持核心逻辑:保留了原代码中“枚举N的倍数并检查各位和”的核心思路,只是解决了原代码的限制问题。
测试验证
- 输入
9:返回18(符合预期) - 输入
10:返回190(符合预期) - 输入
99:最终会找到符合条件的最小X(代码会保证找到数值最小的那个) - 输入
100:返回19999999999900(各位和1+11*9+0+0=100,且是100的倍数)
内容的提问来源于stack exchange,提问作者Aditya Verma
相关产品推荐
相关产品推荐

