2013-09-22 4 views
0

이 코드는 정상적으로 컴파일되지만, 실행하면 두 숫자가 예상대로 묻히고 그냥 앉아서 아무 것도하지 않습니다. 나는 인터넷을 수색하고 하루 종일이 일을했습니다. 드디어 동굴 탐험을하고 도움을 청합니다.내 유클리드 알고리즘이 매우 천천히 작동하고 있습니다.

루프백이 자동으로 실행되지 않는 문제입니까? 이것에 10 시간 후에, 나는 아무것도 발견하지 않았다.

import java.util.Scanner; 

public class EA 
{ 
    public static void main (String[] args) 
    { 
     // get first integer from user 
     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter the larger integer: "); 
     int I; 
     I = input.nextInt(); 

     // get second integer from user 
     System.out.println("Please enter the smaller integer: "); 
     int J; 
     J = input.nextInt(); 

     //resolve the issue of zero 
     while(J<1) 
     { 
      System.out.println("Can not divide by zero!"); 
      System.out.println("Please enter new smaller integer: "); 
      J = input.nextInt(); 

      //do the calculations 
      while(J>0) 
      { 
       int Remainder; 
       Remainder = I % J; 

       while(Remainder>0) 
       { 
        I = J; 
        J = Remainder; 

        return; 

       } 
       System.out.println("GCD is" + J); 
      } 
     } 
    } 
} 
+7

무한 루프가 아닌 확실한 작업을 수행하고 있습니까?모든 루프에 출력을 추가하거나 한 번에 한 줄씩 단계별로 코드를 디버깅 해보십시오. –

+0

지금까지의 가장 좋은 분석 : "ask J twice"는 코드가 정지되는 원인입니다. 그게 해결되면,'return'은 논리를 깨뜨릴 것입니다. 그리고'return' 문제가 해결되면 무한 루프가 시작될 것입니다. – SJuan76

답변

0

.

1) 제로의 문제를 해결 그동안의 브래킷는 최대 공약수를 계산하기 위해 가변 J.

while (J < 1) { 
    System.out.println("Can not divide by zero!"); 
    System.out.println("Please enter new smaller integer: "); 
    J = input.nextInt(); 
} 

2) 알고리즘의 값을 재 할당 한 후 갑자기 종료해야 다음은 : OT 중

public static void main(final String[] args) { 
    // get first integer from user 
    final Scanner input = new Scanner(System.in); 
    System.out.println("Please enter the larger integer: "); 
    int I; 
    I = input.nextInt(); 

    // get second integer from user 
    System.out.println("Please enter the smaller integer: "); 
    int J; 
    J = input.nextInt(); 

    // resolve the issue of zero 
    while (J < 1) { 
     System.out.println("Can not divide by zero!"); 
     System.out.println("Please enter new smaller integer: "); 
     J = input.nextInt(); 
    } 
    // do the calculations 
    while (J != 0) { 
     int Remainder; 
     Remainder = I % J; 
     I = J; 
     J = Remainder; 
    } 
    System.out.println("GCD is" + I); 

} 
+0

고마워요! 그것이 어떻게 배치되어야 하는지를보기위한 거대한 도움. 이제 어떻게 작동시키는 지 알고 있습니다. 더 많은 능력을 추가하고 학습을 계속할 수 있습니다. 다시 감사합니다! – phantasms

+0

내 대답이 도움이되었음을 기쁘게 생각합니다! –

0

루프 중간에있는 return은 실행을 종료합니다.

이 하나

while(Remainder>0) 
{ 
    I = J; 
    J = Remainder; 

    return; <------- THIS IS THE RETURN THAT BREAKS ALL 

} 

는 그래서 그것은 System.out.println에 도착하지 않습니다.

업데이트 : J에 대해서도 input.nextInt() 두 번합니다. 아마 당신의 설명에서, 그것은 세 번째 정수를 입력하기 위해 당신을 기다리고 있습니다.

+0

네,하지만'return'을 꺼내면 내부 루프가'Remainder '를 수정하지 않기 때문에 무한 루프가 생깁니다. 내부 루프가 전혀 없어야합니다. – paddy

+1

@paddy 네, 고맙습니다. 이 코드는 버그 페스티벌입니다. – SJuan76

+0

고마워요! 솔직히 왜 내가 거기에 넣었는지조차 모르겠다. – phantasms

2

SJuan은 반환이 참 루프를 중단 언급하지만,이 고정 될지라도 몇 가지 다른 문제가 있습니다

  • 내부 동안 끝이 없을 (무한 루프)
  • 결과 것입니다 J에 저장 - I
  • System.out.println("GCD is " + I); 외부에 인쇄해야하는 동안!

프로그램의 "마음"이 작업을 수행해야한다 : 그동안의 반환, 알고리즘 및 제 동안의 브래킷 : 1 개 이상의 오류가 있습니다

// we get here with valid values stored in I,J 
    int Remainder = I % J; 
    //do the calculations 
    while(Remainder>0) 
    { 
     I = J; 
     J = Remainder; 
     Remainder = I % J; 
    } 
    System.out.println("GCD is " + J); 
+0

도움을 주셔서 감사합니다! 나는 진지하게 논평의 장소를 엉망으로 만들고 있었다. 분명히 기호는 특정 순서로 닫아야합니다. 누가 알았 겠어? :) – phantasms

2

: 여기

function gcd(a, b) 
    while b ≠ 0 
     t := b 
     b := a mod t 
     a := t 
    return a 

이 코드의 올바른 버전입니다 이미 언급 한 바에 따르면 whileif을 혼동하고 있습니다. 첫 번째 입력이 나쁜 경우에만 실행되는 while 루프 안에 알고리즘 로직을 넣었습니다.

// get first integer from user 
Scanner input = new Scanner(System.in); 
System.out.println("Please enter the larger integer: "); 
int I; 
I = input.nextInt(); 

// get second integer from user 
System.out.println("Please enter the smaller integer: "); 
int J; 
J = input.nextInt(); 

//resolve the issue of zero 
while(J<1) 
{ 
    // You never reach here under ordinary conditions 
} 
+0

도움을 주셔서 감사합니다! 일 첫날. : p – phantasms

+0

직업? 확실히 당신은 프로그래머로서 고용되지 않았습니다. 이것은 숙제와 비슷해 보입니다. – paddy

0

음 유클리드의 알고리즘은 가장 큰 공통 제수를 계산하기 위해 두 입력이 모두 0이 아니어야하기 때문에 단점이 있습니다. 그러나 만약 입력 중 하나가 0 ('0') 일 때 GCD를 찾고 싶다면 로직을 약간 조정하십시오. 입력 중 하나가 0 일 때 GCD는 1이고 GCD를 계산하려면 'a'가 'b'보다 커야합니다. 아래 스 니펫을 확인하십시오.

if (a < b) { 
     int temp = a; 
     a = b; 
     b = temp; 
    } 
    if (b == 0) { 
     System.out.println("1"); 
    } else { 
     while (b != 0) { 
      r = a % b; 
      a = b; 
      b = r; 
     } 
관련 문제