Java求输入正整数最大因子代码异常:输入50输出2510求排查
如何修复“显示输入数字最大因子”代码的错误?
你写了一段Java代码想实现显示输入数字的最大因子,但输入50时却输出了2510,这明显不符合预期。我们来一步步拆解代码里的问题,然后给出修复方案。
你的原代码
package Testing; import java.util.Scanner; public class test { public static void main (String[] args){ Scanner scan1 = new Scanner(System.in); System.out.print("Input positive integer: "); int n = scan1.nextInt(); for (int i = 2; i < Math.sqrt(n); i++){ if (n % i == 0){ System.out.print(n/i); } } } }
代码里的核心错误
1. 循环条件遗漏了等于的情况
你用了i < Math.sqrt(n),但正确的循环条件应该是i <= Math.sqrt(n)。举个例子,50的平方根约是7.07,这个条件会让i=7时无法进入循环;如果是完全平方数比如36,它的平方根是6,漏掉等于的情况会直接忽略i=6这个关键因子,导致结果错误。
2. 找到因子就直接输出,没有记录最大值
当前代码只要找到一个能整除n的i,就直接输出n/i,而不是记录所有可能因子里最大的那个。比如输入50时,循环会找到i=2(输出25)和i=5(输出10),两个结果直接连在一起输出,就变成了2510。
3. 没有处理质数的情况
如果输入的是质数(比如7),它除了1和自身没有其他因子,你的循环里找不到任何符合条件的i,所以不会输出任何内容,这显然不符合需求。
修复后的代码
下面是修正后的代码,解决了以上所有问题:
package Testing; import java.util.Scanner; public class test { public static void main (String[] args){ Scanner scan1 = new Scanner(System.in); System.out.print("Input positive integer: "); int n = scan1.nextInt(); int maxFactor = 1; // 默认最大真因子是1 // 遍历到平方根,寻找所有因子对 for (int i = 2; i <= Math.sqrt(n); i++){ if (n % i == 0){ // 因子对是i和n/i,取较大的那个和当前maxFactor比较 int currentFactor = Math.max(i, n/i); if (currentFactor > maxFactor){ maxFactor = currentFactor; } } } // 处理特殊情况:如果输入的是1,没有除自身外的因子 if (n == 1) { System.out.println("1没有除自身外的因子"); } else { // 如果你想要把数字自身作为最大因子(比如输入50输出50),可以改成 Math.max(maxFactor, n) System.out.println("最大真因子是:" + maxFactor); } } }
测试验证
- 输入50:输出
最大真因子是:25,符合预期 - 输入7(质数):输出
最大真因子是:1 - 输入36:输出
最大真因子是:18 - 输入1:输出
1没有除自身外的因子
这样修改后,代码就能正确找到输入数字的最大真因子啦!
内容的提问来源于stack exchange,提问作者Zepheriah
相关产品推荐
相关产品推荐

