为什么我的程序在某些情况下输出不正确?

时间:2015-08-17 19:02:00

标签: java algorithm

我在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;
    }
}

3 个答案:

答案 0 :(得分:4)

如果您的某个号码ab是另一个号码的倍数,那么您的if条件会导致break1返回,这是不正确的。但算法的其余部分也是不正确的。

根据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;
}