2013-03-02 27 views
5

Tôi đang viết chương trình để tính toán phần mở rộng thập phân trên số 103993/33102 và tôi muốn in ra tất cả các số thập phân sau tùy thuộc vào số người dùng nhập. Nó chạy nhanh chóng cho tất cả số lượng lên đến 10^5 nhưng nếu nhập 10^6 vào chương trình mất khoảng 5 phút để in ra một câu trả lời. Làm thế nào tôi có thể tăng tốc độ? Tôi đã thử hai cách tiếp cận khác nhau bằng cách sử dụng BigDecimal và phương pháp khác bằng cách sử dụng các chuỗi và cả hai đều không hoạt động hiệu quả.Chương trình mở rộng thập phân chạy rất chậm đối với các đầu vào lớn

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' và' cases' là gì? – Joni

+0

dec là số thập phân bạn đang mở rộng và các trường hợp là nếu bạn muốn in số thập phân mở rộng của số theo nhiều cách, Ví dụ nếu tôi nhập 2 4 6 nó sẽ in ra số được mở rộng đến 4 chữ số sau đó sẽ in nó ra một lần nữa mở rộng đến thứ 6 –

Trả lời

2

Thay vì tạo một chuỗi dài các chữ số, hãy in các chữ số. Ví dụ:

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

Tạo chuỗi dài bằng cách ghép nối thực sự không tốt cho hiệu suất vì chuỗi không thay đổi. Chương trình dành tất cả thời gian tạo chuỗi mới, dài hơn chuỗi kia và sao chép các ký tự từ cũ sang mới, về cơ bản triển khai Schlemiel the Painter's algorithm.

+0

ông cũng có thể sử dụng một 'StringBuffer' hoặc' StringBuilder' – Seismoid

+0

Cảm ơn tôi luôn luôn quên rằng các chuỗi là bất biến và siêu chậm –

Các vấn đề liên quan