我在Java中实现了欧几里德算法,以找到两个给定数字的最大公约数(GCD)。
在大多数情况下,我的程序运行正常,我已经用一些随机数字进行了测试,但是,我发现在一个案例中(我知道)它输出的输出不正确,这是以下数字组合:
输入整数a:8965 输入整数b:55
程序的输出应该是55,尽管情况并非如此。给出的结果如下:
gcd = 1 执行时间:0.005747ms。
我不确定为什么这个特定的数字组合会导致问题,因为它适用于其他数字,例如,这是一组不同数字的结果:
输入整数a:15000
输入整数b:5325
gcd = 75
执行时间:0.007389ms。
import java.util.Scanner;
public class EuclideanAlgorithm {
public static void main (String [] args) {
int a, b;
try(Scanner sc = new Scanner(System.in);) {
System.out.print("Enter integer a: ");
a = sc.nextInt();
System.out.print("Enter integer b: ");
b = sc.nextInt();
}
long start = System.nanoTime();
int answer = EuclideanAlgorithm(a, b);
long stop = System.nanoTime();
System.out.println("gcd = " + answer);
System.out.println("Execution time: " + ((stop - start) / 1e+6) + "ms.");
}
public EuclideanAlgorithm() {}; //Suppress default constructor
private static int EuclideanAlgorithm(int a, int b) {
if ( (a == 0) || (b == 0)) {
return 0;
}
if (b > a) {
int temp = a;
a = b;
b = temp;
}
int gcd = 1;
while(gcd != 0) {
if( (a % b) == 0) {
break;
}
gcd = a % b;
a = b;
b = gcd;
}
return gcd;
}
}
答案 0 :(得分:4)
如果您的某个号码a
,b
是另一个号码的倍数,那么您的if
条件会导致break
和1
返回,这是不正确的。但算法的其余部分也是不正确的。
根据Euclidean Algorithm的伪代码:
function gcd(a, b)
while b ≠ 0
t := b
b := a mod b
a := t
return a
您需要检查b
是否不是0
,而不是gcd。您需要修改代码以匹配此算法;您的代码目前尚未与此算法匹配。
答案 1 :(得分:3)
由于此while循环中的if条件
int gcd = 1;
while(gcd != 0) {
if( (a % b) == 0) {
break;
}
gcd = a % b;
a = b;
b = gcd;
}
因此,如果开头的%b = 0 - >结果总是等于1。
你需要单独处理这个案子。
int gcd = b;
while(a % b != 0){
gcd = a % b;
a = b;
b = gcd;
}
答案 2 :(得分:1)
很容易55分8965这意味着你在第一行中断了程序并返回你的初始值,即1。
相反,这样的事情可能有所帮助。
int gcd = 1;
if( (a % b) == 0) {
return b;
}
while(gcd != 0) {
if( (a % b) == 0) {
break;
}
gcd = a % b;
a = b;
b = gcd;
}