2013-03-02 12 views
5

Sto scrivendo un programma per calcolare l'espansione decimale sul numero 103993/33102 e voglio stampare tutti i decimali finali a seconda del numero di input dell'utente. Funziona rapidamente per tutti i numeri fino a 10^5 ma se l'input 10^6 per il programma richiede circa 5 minuti per stampare una risposta. Come posso accelerare le cose? Ho provato due diversi approcci uno usando BigDecimal e l'altro usando le stringhe e nessuno funziona in modo efficiente.Programma di espansione decimale in esecuzione molto lento per ingressi di grandi dimensioni

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

Cosa sono 'dec' e' cases'? – Joni

+0

dec è il numero di decimali che si stanno espandendo e casi è se si desidera stampare l'espansione decimale del numero in più modi, Ex se inserisco 2 4 6 si stampa il numero espanso al 4 decimale quindi lo stamperebbe di nuovo espanso al sesto –

risposta

2

Invece di creare una lunga serie di cifre è sufficiente stampare le cifre. Per esempio:

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

Creazione di una lunga stringa in un ciclo concatenando è davvero male per le prestazioni, perché le stringhe sono immutabili. Il programma spende tutto il suo tempo creando nuove stringhe, una più lunga dell'altra, e copiando i caratteri dal vecchio al nuovo, implementando essenzialmente Schlemiel the Painter's algorithm.

+0

potrebbe anche usare un 'StringBuffer' o' StringBuilder' – Seismoid

+0

Grazie sempre dimentico che queste stringhe sono immutabili e super lente –

Problemi correlati