Java求最大质因数程序输出错误问题排查
问题分析与修复方案
嘿,我帮你排查下代码里的问题,输入14输出1确实是因为几个关键逻辑搞反或者写错了:
- 因数判断完全写反了:你代码里的
if(n%i != 0)是在找不能整除n的数(也就是非因数),但我们需要的是能整除n的因数啊!应该改成if(n%i == 0)。就拿14来说,7是它的因数,当i=7时14%7==0,但原来的代码直接跳过了这个i,根本没机会判断它是不是质数。 - 质数判断逻辑错误:你现在的质数判断是遍历j从1到c-1,只要
c%j==0就把j赋值给p,最后拿p去比max。但比如c=7的时候,j=1就满足7%1==0,p被设为1,后面的j都不满足,所以p一直是1,这显然不对。正确的质数判断应该是:一个大于1的数,除了1和它本身,没有其他因数。我们可以遍历2到√c的数,只要有一个能整除它,就不是质数。 - 循环范围漏掉了n本身:你的外层循环是
i=1;i<n;i++,如果输入的n本身是质数(比如输入7),这个循环根本找不到它,因为i到6就结束了,应该改成i=1;i<=n;i++(或者更高效的i<=n/2,不过先保证逻辑正确)。 - max的更新时机不对:你在质数判断的循环里每次都更新max,这会导致把非质数的因数(比如1)也当成候选,应该等确定某个因数是质数之后,再去比较更新max。
下面是修正后的代码,我加了详细注释:
import java.util.Scanner; public class Problem3 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter the number"); int n = Integer.parseInt(sc.next()); int maxPrime = 0; // 遍历所有可能的因数,从1到n for(int i=1;i<=n;i++) { // 先判断i是不是n的因数 if(n%i == 0) { boolean isPrime = true; // 处理特殊情况:1不是质数 if(i <= 1) { isPrime = false; } // 2是唯一的偶质数 else if(i == 2) { isPrime = true; } // 大于2的数,检查从2到sqrt(i)是否有因数 else { for(int j=2;j<=Math.sqrt(i);j++) { if(i%j == 0) { isPrime = false; break; // 找到因数就直接跳出,不用继续判断 } } } // 如果当前因数是质数,且比记录的最大质数大,就更新 if(isPrime && i > maxPrime) { maxPrime = i; } } } System.out.println(maxPrime); sc.close(); } }
测试输入14的话,会找到因数1、2、7、14,其中质数是2和7,最大的就是7,符合你的预期啦。另外,要是想优化性能,可以把外层循环改成i<=n/2,因为大于n/2的因数只有n本身,这样能减少循环次数~
内容的提问来源于stack exchange,提问作者pop1912
相关产品推荐
相关产品推荐

