2013-03-02 10 views
5

Piszę program do obliczania dziesiętnego rozszerzenia na numer 103993/33102 i chcę wydrukować wszystkie końcowe znaki dziesiętne w zależności od tego, jaki numer użytkownik wprowadza. Działa szybko dla wszystkich numerów do 10^5, ale jeśli wejście 10^6 do programu zajmuje około 5 minut, aby wydrukować odpowiedź. Jak mogę przyspieszyć? Próbowałem dwa różne podejścia jeden przy użyciu BigDecimal i innych przy użyciu ciągów i żaden z nich nie działa skutecznie.Program dziesiętny rozwijany działa bardzo wolno dla dużych wejść

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

Co to są 'dec' i' cases'? – Joni

+0

dec to liczba miejsc dziesiętnych, do których się rozwijasz, i przypadki są, jeśli chcesz wydrukować dziesiętne rozwinięcie liczby na wiele sposobów, np. Jeśli wprowadzę 2 4 6, wydrukowałbym liczbę rozwiniętą do 4 miejsc po przecinku, wydrukuje go ponownie rozszerzony do szóstego –

Odpowiedz

2

Zamiast tworzyć długi ciąg cyfr, po prostu wydrukuj cyfry. Na przykład:

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

Tworzenie długiego łańcucha w pętli przez konkatenację jest bardzo szkodliwe dla wydajności, ponieważ łańcuchy są niezmienne. Program spędza cały czas tworząc nowe łańcuchy, jeden dłuższy niż drugi, i kopiuje znaki ze starego do nowego, zasadniczo wdrażając Schlemiel the Painter's algorithm.

+0

mógłby również użyć 'StringBuffer' lub' StringBuilder' – Seismoid

+0

Dzięki Zawsze zapominam, że te Struny są niezmienne i super wolne –

Powiązane problemy