Бесконечный цикл в реализации метода наибольшего общего знаменателя Евклида
Логическая ошибка со вторым 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;