实现欧几里德最大公分母方法的无限循环

时间:2014-04-02 01:31:36

标签: java algorithm greatest-common-divisor

第二个println语句的逻辑错误导致我的代码中出现无限循环。

它在while循环中我理解导致它继续打印因为while测试是真的。分别使用48和18作为num1和num2,我得到GCD的正确答案是6.打印输出语句的位置是错误的,我无法弄清楚放在哪里。

我的代码找到两个整数的GCD,只要其中任何一个都不是负数。我使用了Euclid的方法。

感谢您的帮助!

import java.util.*;

public class Chapter5Lab_Problem1 {


  public static void main(String[] args) { 
    Scanner console = new Scanner(System.in);
    System.out.print("Type the first integer to find GCD");
    int num1 = console.nextInt();
    System.out.print("Type the second integer to find GCD ");
    int num2 = console.nextInt();
    gcd(num1,num2);
  }

  public static void gcd( int x, int y){
    while( x >= 0 && y >= 0){
      if( x == 0){
        System.out.println("The GCD is " + y);
      }
      while( y != 0){
        if( x > y){
          x = x - y;
        }else{
          y = y - x;
        }

      }
     System.out.println("The GCF is " + x); 
    } 
  } 
}

2 个答案:

答案 0 :(得分:1)

X和Y将始终为> = 0.它们在此算法中的最小值为0,因此第一个while语句的条件始终成立。请改为x > 0 && y > 0

答案 1 :(得分:1)

这是一个递归的答案。老师喜欢递归。当程序保持无限或太长时,递归是有风险的。

public static int GCD(int n1, int n2){

  if(a==0 || b==0)
    return a+b;

  return GCD(n2, n1%n2)
}

如果你必须进行循环,那么这就是实现

int n3;
while(n != 0 || n2!= 0){

  n3 = n2;
  n2 = n1%n2;
  n1 = n3;
}

return n1+n2;