2013-03-02 2 views
5

숫자 103993/33102의 소수 확대를 계산하는 프로그램을 작성 중이며 사용자가 입력 한 숫자에 따라 모든 소수의 십진수를 인쇄하고 싶습니다. 그것은 최대 숫자 10^5까지 빠르게 실행되지만, 프로그램에 입력 10^6이 응답을 출력하는 데 약 5 분이 걸리는 경우. 어떻게하면 속도를 높일 수 있습니까? BigDecimal을 사용하는 두 개의 다른 접근법과 다른 하나는 문자열을 사용하여 시도했지만 어느 것도 효율적으로 작동하지 않습니다.큰 입력에 대해 매우 느리게 실행되는 십진수 확장 프로그램

public static void main(String[] args) throws NumberFormatException, 
     IOException { 
    // BigDecimal num1 = new BigDecimal(103993); 
    // BigDecimal num2 = new BigDecimal(33102); 
    String repNum = "415926530119026040722614947737296840070086399613316"; 
    // pw.println(num.toString()); 
    String sNum = "3.1"; 
    // pw.println(repNum.length()); 
    int cases = Integer.parseInt(br.readLine()); 
    int dec; 
    for (int i = 0; i < cases; i++) { 
     sNum = "3.1"; 
     dec = Integer.parseInt(br.readLine()); 

     if (dec == 0) 
      pw.println("3"); 
     else if (dec <= 52) { 
      sNum += repNum.substring(0, dec - 1); 
      pw.println(sNum); 
     } else { 
      while (dec > 52) { 
       sNum += repNum; 
       dec -= 51; 
      } 
      sNum += repNum.substring(0, dec - 1); 
      pw.println(sNum); 

     } 

     // pw.println(num1.divide(num2, dec, 
     // RoundingMode.FLOOR).toString()); 
    } 
} 
+0

'dec'과'cases'는 무엇입니까? – Joni

+0

dec은 확장 할 소수점의 수이며, 여러 가지 방법으로 소수점 이하 자릿수를 출력하려는 ​​경우입니다. 예 2 4 6을 입력하면 4 자리수로 확장 된 숫자가 출력됩니다 다시 인쇄 할 것입니다. –

답변

2

긴 숫자 문자열을 만드는 대신 숫자를 인쇄하면됩니다. 예를 들어 문자열 불변이기 때문에

 while (dec > 52) { 
      System.out.print(repNum); 
      dec -= 51; 
     } 
     pw.println(repNum.substring(0, dec - 1)); 

연결하여 루프에서 긴 문자열을 만들기 성능 정말 나쁜 것입니다. 이 프로그램은 항상 새로운 문자열을 만드는 데 모든 시간을 소비하며, 하나는 다른 문자열보다 길고 오래된 문자는 새로운 문자로 복사합니다. Schlemiel the Painter's algorithm을 구현합니다.

+0

그는'StringBuffer' 또는'StringBuilder'도 사용할 수 있습니다 – Seismoid

+0

감사합니다. 나는 항상이 문자열이 변경 불가능하고 매우 느립니다. –

관련 문제