【问题标题】:getting wrong value with my gcd program [closed]我的 gcd 程序得到错误的值[关闭]
【发布时间】:2016-03-29 18:53:20
【问题描述】:

我刚刚写了一个程序来计算两个数字的gcd。我用数字 6 和 4 对其进行了测试。我的程序返回的结果是 4,这显然是错误的,因为 6 和 4 的 gcd 是 2。

import javax.swing.*;

public class Zahlen {
  public static long gcd(long m, long n){
    m = Long.parseLong(JOptionPane.showInputDialog("Enter value for m"));
    n = Long.parseLong(JOptionPane.showInputDialog("Enter value for n"));
    long tmp;
    while (n > 0) { 
      tmp = n;
      m = n;
      n = m;
      n = n%m;
    } // end of while
    return m;
  }

  public static void main(String[] args){
    System.out.print(Zahlen.gcd(6,4));
  }
}

【问题讨论】:

  • m = n;n = m;... 这只是设置 n = n;
  • 另外,如果要立即覆盖参数,为什么还要使用参数?
  • 为什么一个简单的调试问题会获得投票?
  • 为什么这个问题的票数接近“不能再被复制或印刷错误”?这个问题都不是。

标签: java greatest-common-divisor


【解决方案1】:

您的算法代码不正确。片段

m = n;
n = m;

没有任何用处,分配给tmp 的值没有做任何事情。

获取余数,然后将n 的值赋给m,然后将余数赋给n。为此目的使用tmp

while (n > 0) {
    tmp = m%n;
    m = n;
    n = tmp;
}

此外,如果您已经有参数,为什么还要在方法gcd 中向用户询问mn 值?要么不要在gcd 中询问而只使用参数,要么将JOptionPane 代码移动到main,然后将用户的号码传递给那里的gcd

【讨论】:

  • 在开始循环之前,您必须确保 n <= m
  • @schwobaseggl 如果n > m,那么第一个循环将有效地交换两个数字。
  • hmm.. m%n == 0 for n > m => n = 0 循环,返回0。没有?
  • @schwobaseggl 否。如果n > m,那么m%n == m
  • 你完全正确! :) 我的主要脑部故障
【解决方案2】:

您可以从 main 方法调用以下函数(不使用递归):

public static int gcd(int n, int m){
    int gcd=1;
    int upto=n>m?m:n;

    for(int i=1;i<=upto;i++){
       if(n%i==0 && m%i==0){
            gcd=i;
        }
    }
   return gcd;
}

【讨论】:

  • 这个答案有什么问题?
【解决方案3】:

这对我有用。我用 int 做到了,但将其转换为 long 并不难。

int m = Integer.parseInt(JOptionPane.showInputDialog("Enter value for m"));
         int n = Integer.parseInt(JOptionPane.showInputDialog("Enter value for n"));
        int i =1;
        int gcd=1;
        while(m>n?i<=n:i<=m){
            if(m%i==0&& n%i==0){
                gcd=i;
            }
            i++;
        }
        System.out.println(gcd);}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多