【发布时间】:2015-08-17 19:02:00
【问题描述】:
我在 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;
}
}
【问题讨论】:
-
@Trobbins 我的调试器没有显示任何警告或错误,正如我所说,该程序在大多数情况下都有效,只是对于某些数字组合,它给出了不正确的输出,我可以'不明白为什么......
-
当
a可以被b整除时,您会立即中断并将gdc保留为初始值。也许您需要将gdc初始化为b?