Бесконечный цикл в реализации метода наибольшего общего знаменателя Евклида

Логическая ошибка со вторым println Заявление вызывает бесконечный цикл в моем коде ниже.

Это внутри цикла while, который, как я понимаю, заставляет его продолжать печатать, потому что тест while истинен. Используя 48 и 18 как num1 и num2 соответственно, я получаю правильный ответ GCD, равный 6. Расположение оператора print out неверно, и я не могу понять, где его разместить.

Мой код находит GCD из двух целых чисел, если они не отрицательны. Я использовал метод Евклида.

Спасибо за любую помощь!

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 ответа

Решение

X и Y всегда будут>= 0. Минимум, которым они могут стать в этом алгоритме, равен 0, поэтому условие для первого оператора while всегда выполняется. Пытаться x > 0 && y > 0 вместо.

Это рекурсивный ответ. Учителя любят рекурсию. Рекурсия рискованна, когда она бесконечна или слишком длинна стека для программы.

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;
Другие вопросы по тегам