2010-12-06 6 views
0

Java로이 프로그램을 가져옵니다. java.util. *;내 프로그램에 도움이 필요합니다.


import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JTextField; 

public class EuclidGui 
{ 
    private static final String PROMPT_A = "#1"; 
    private static final String PROMPT_B = "#2"; 
    private static final String BUTTON_TEXT = "Get GCD >>"; 
    private static final String EXCEPTION_TITLE = "Input Exception"; 
    private static final String INSTRUCTIONS = "Type to integer and press 'Get GCD'"; 
    private static final String DIALOG_TITLE = "Euclid's Algorithm"; 
    private static final int FIELD_WIDTH = 6; 

public static void main (String[] args) 
{ 
final JTextField valueA = new JTextField (FIELD_WIDTH); 
final JTextField valueB = new JTextField (FIELD_WIDTH); 
final JTextField valueGcd = new JTextField (FIELD_WIDTH); 
JLabel labelA = new JLabel(PROMPT_A); 
JLabel labelB = new JLabel(PROMPT_B); 
JButton computeButton = new JButton(BUTTON_TEXT); 
Object[] options = new Object[] {labelA, valueA, labelB, valueB, computeButton, valueGcd}; 
valueGcd.setEditable (false); 
computeButton.addActionListener(new ActionListener() 
{ 
    public void actionPerformed(ActionEvent evt) 
    { try 
     { 
      int a = Integer.parseInt(valueA.getText()); 
      int b = Integer.parseInt(valueB.getText()); 
      int gcd = Euclid.getGcd(a , b); 

      valueGcd.setText(Integer.toString(gcd)); 
     } 
     catch (Exception e) 
     { 
      JOptionPane.showMessageDialog(null, e.getMessage(), EXCEPTION_TITLE, JOptionPane.ERROR_MESSAGE); 

     } 
     } 
    }); 
    JOptionPane.showOptionDialog(null, INSTRUCTIONS, DIALOG_TITLE, JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, 
    null, options, null); 
}  
}  

public class Euclid { 

    private static final String EXCEPTION_MSG = 
     "Invalid value (%d); only positive integers are allowed. "; 

    public static int getGcd(int a, int b) 
     { 
      if (a < 0) 
       { 
        throw new IllegalArgumentException(String.format(EXCEPTION_MSG, a)); 
       } 
       else 
        if (b < 0) 
        { 
         throw new IllegalArgumentException(String.format(EXCEPTION_MSG, b)); 
        } 

      while (b != 0) 
      { 


       if (a > b) 
        { 
        a = a - b; 
          }  
       else 
        { 
         b = b - a; 
        }  
      } 
       return a; 
     } 
    } 
와 나는 그것을 계산 시간 코드를 추가 할하지만 난 아무 생각이 어떻게, 어떤 하나의 아이디어가 있다면 내가 도와 use.Please 올바른 코드는 무엇인가.

+1

모두 코드로 들여 쓰기하여 코드로 모두 표시하십시오. – gdj

+0

'타임 코드'에서 무엇을 의미합니까 –

답변

2

System.currentTimeMillis() 트릭을 할 것입니다 :

long start = System.currentTimeMillis(); 
// do stuff 
long timeTaken = System.currentTimeMillis() - start; 
+0

이것은 원칙 상 정확합니다. 그러나 OP의 특별한 경우에는 작동하지 않을 수 있습니다. 내 대답을 보라. –

+0

스티븐은 절대적으로 정확합니다. 그것은 내 역할에 대한 다소 눈부신 감독이었습니다. FWIW 당신이 지적한 문제로 인해 nanoTime에 신경 쓰지 않을 것입니다. 밀리 세컨드 (milliseconds)와 커다란 루프가 앞으로 나아갈 길입니다! – ZoFreX

1

확률이 getGcd에 단일 통화가 당신이 안정적이고 정확하게 측정하는 데 어려움이있을 것이다 그래서 약간의 시간이 걸릴 것입니다.

System.currentTimeMillis() 메서드는 밀리 초 단위로 측정 한 벽시계 시간을 알려줍니다. 그러나 밀리 초 클록의 세분성은 너무 거칠 수 있습니다. (javadoc 읽기!).

System.nanoTime() 메서드는 시스템 시간을 (javadoc에서 말하는 것처럼) "나노초 정밀도이지만 반드시 나노초 정확도가 아닙니다."라고합니다..

일부 운영 체제가 설치된 멀티 코어 컴퓨터에도 nanoTime()과 관련된 문제가 있습니다. 예를 들어, 서로 다른 코어가 서로 존중할 수있는 독립적 인 nanoTime 클럭을 가질 수 있다고 들었습니다. 결과적으로 System.nanoTime() 값은 비 단순한 값을 반환 할 수 있습니다. 예 : 현재 스레드가 두 개의 nanoTime() 호출 사이에 다른 코어에서 실행되도록 OS에 의해 다시 스케쥴 된 경우.

내가이 작업을 수행했다면 getGcd()에 대한 호출을 10,000 또는 100,000 회 실행 한 루프에 넣고 루프 시간을 측정 한 다음 측정 한 시간을 관련 요소로 나눕니다.

관련 문제