如何修正Java循环,仅在两数互质时输出Relatively Prime
Java公约数程序的逻辑错误修正
需求
编写Java程序,接收两个用户输入的正整数,输出它们的所有公约数(包含1);仅当两数互质(即公约数只有1)时,在输出1后打印“互质”。
问题根源
你提供的代码中,只要遍历到i=1就无条件打印“Relatively Prime”,完全没考虑后续是否存在其他公约数。哪怕两数有多个公约数,这条提示也会被错误输出,不符合需求。另外原代码还有个小问题:遍历上限固定为b,如果a比b小,会做多余的循环,应该取两数中的较小值作为遍历上限。
错误代码
import java.util.Scanner; public class DivisorDemo { public static void printCommonDivisors(int a, int b) { System.out.println("Common divisors of " + a + " and " + b + ":"); for (int i = 1; i <= b; i++) if (a % i == 0 && b % i == 0) { if (a % i == 0 && b % i == 0) { // 重复判断,无意义 System.out.println(i); if (i == 1) System.out.println("Relatively Prime"); } } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Please enter two positive integers:"); int input1 = scan.nextInt(); int input2 = scan.nextInt(); printCommonDivisors(input1, input2); } }
修正后的代码
用一个布尔标记变量hasOtherDivisor记录是否存在大于1的公约数,遍历结束后再判断是否需要打印“互质”提示,同时把所有提示文本改成中文:
import java.util.Scanner; public class DivisorDemo { public static void printCommonDivisors(int a, int b) { System.out.println(a + " 和 " + b + " 的公约数:"); boolean hasOtherDivisor = false; // 取两数中的较小值作为遍历上限,减少无效循环 int maxDivisor = Math.min(a, b); for (int i = 1; i <= maxDivisor; i++) { if (a % i == 0 && b % i == 0) { System.out.println(i); // 如果找到大于1的公约数,标记为true if (i > 1) { hasOtherDivisor = true; } } } // 只有没有其他公约数时,才打印互质提示 if (!hasOtherDivisor) { System.out.println("互质"); } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入两个正整数:"); int input1 = scan.nextInt(); int input2 = scan.nextInt(); printCommonDivisors(input1, input2); } }
测试验证
案例1:互质的两个数(3和5)
请输入两个正整数: 3 5 3 和 5 的公约数: 1 互质
案例2:有多个公约数的两个数(10和20)
请输入两个正整数: 10 20 10 和 20 的公约数: 1 2 5 10
内容的提问来源于stack exchange,提问作者user20696042
相关产品推荐
相关产品推荐

