2014-04-02 1 views
0

두 번째 논리 오류 println 문을 사용하면 아래 코드에서 무한 루프가 발생합니다.GCD 방법의 논리를 알아낼 수 없습니다

내가 알고있는 while 루프의 내부는 while 테스트가 true이므로 인쇄를 계속합니다. 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); 
    } 
    } 
} 
+0

입니다. – thang

+0

정확하게 사용하는 방법을 모르고 있습니다. modulus를 대신 사용하여 메서드를 변경하는 방법을 보여줄 수 있습니까? – foodnliquor

답변

1

X와 Y는 항상> = 0입니다.이 알고리즘에서 최소가 될 수있는 최소값은 0이므로 첫 번째 while 문에 대한 조건이 항상 유지됩니다. 대신 x > 0 && y > 0을 시도하십시오.

+0

고마워요! Sheesh는 항상 그렇게 단순합니다. 나는 SOP 성명을 어디에 넣을 지 찾아 내려고 미쳤다. 완전히 간과했다. 대단히 감사합니다. – foodnliquor

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; 
관련 문제