【问题标题】:Why is my program giving an incorrect output in certain cases?为什么我的程序在某些情况下会给出不正确的输出?
【发布时间】: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

标签: java algorithm


【解决方案1】:

只要您的数字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。您需要修改代码以匹配此算法;您的代码当前与此算法不匹配。

【讨论】:

    【解决方案2】:

    因为这个while循环里面的if条件

    int gcd = 1;
    while(gcd != 0) {
        if( (a % b) == 0) {
            break;
        }
        gcd = a % b;
        a  = b;
        b = gcd;
    }
    

    所以,万一开始时 a % b = 0 -> 结果总是等于 1。

    你需要单独处理这种情况。

    int gcd = b;
    while(a % b != 0){
       gcd = a % b;
       a = b;
       b = gcd;
    }
    

    【讨论】:

      【解决方案3】:

      很容易 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2019-08-09
        • 1970-01-01
        • 1970-01-01
        • 2016-01-27
        • 2019-01-02
        • 1970-01-01
        • 2014-05-21
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多