2011-05-27 21 views
1

我做了一個可以生成素數的程序。我想要程序寫入文件。當我生成素數達到Integer.Max_Value時,由於某種原因它不會寫出所有的素數,而只是停止。這是我的代碼:BufferedWriter問題

import java.io.*; 

public class Primes { 


public static void main(String[] args) throws IOException { 

    generate(Integer.MAX_VALUE); 

} 

// generate primes. 
public static void generate(int limit) throws IOException { 
    BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Primes.txt")); 
    writer.write(2); 
    for (int i = 3; i <= limit; i += 2) { 
     if (isPrime(i)) { 
      writer.write(Integer.toString(i)); 
      writer.newLine(); 
     } 
    } 
    writer.close(); 
} 

// checking for primes 
public static boolean isPrime(int n) { 
    for (int i = 2; i <= (Math.sqrt(n)); i++) { 
     if (n % i == 0) { 
      return false; 
     } 
    } 
    return true; 
} 
} 
+3

有沒有這樣的不變'Integer.Max_Value'你能張貼您的實際工作的代碼? – 2011-05-27 15:55:08

+1

@Peter有一個constant..http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Integer.html#MAX_VALUE – 2011-05-27 15:59:27

+3

我注意到的第一件事情是,你調理'我<= limit'始終爲真,因爲該限制是最大可能的「int」值。 ;) – 2011-05-27 16:02:06

回答

5

我覺得你的程序根本就不掛,只需要很長時間才能完成工作。

隨着數字變大,檢查它們所花費的時間與其平方根成比例地增加。此外,素數之間的距離越大,數字越大。把它們放在一起,發現素數的速度將很快消失。

您是否附加了一個調試器程序,並暫停執行檢查的局部變量,看看它有什麼?你甚至還輸入System.out.println("About to calculate for " + i);?你怎麼知道你的程序「剛剛停止」?

第一步應該調查一下你的程序實際上在做什麼。如果您使用println消息輸出時間戳,您還可以瞭解檢查每個單獨數字的速度是如何衰減的,因此當您發現暫停時,您可以粗略估計當前檢查應該花費多長時間。


此外,你的程序將永遠不會終止,因爲你有無限的外環。您的for環路的終止條件是i <= Integer.MAX_VALUE,這意味着它將運行,直到它找到i,例如i > Integer.MAX_VALUE。你能說出一個值爲i的地方嗎?

2

我已經登錄到缺陷數據庫,它已被認爲是應該在數天出現在Bugs Database一個新的bug。


這看起來像我在JIT編譯器中的錯誤。它檢測到我< =限制始終爲真(對於Integer.MAX_VALUE -1,這不會發生)併產生不正確的代碼。如果你運行以下。

public static void main(String[] args) { 
    for(int i=0;i<10;i++) 
     generate(Integer.MAX_VALUE); 
    for(int i=0;i<10;i++) 
     generate2(Integer.MAX_VALUE); 
    System.out.println("End of Main"); 
} 

// generate primes. 
public static void generate(int limit) { 
    int lastPrime = 0; 
    for (int i = 3; i <= limit; i += 2) 
     if (isPrime(i)) 
      lastPrime = i; 
    System.out.println("1: Stopped generating at lastPrime= "+lastPrime); 
} 

public static void generate2(int limit){ 
    int lastPrime = 0; 
    for (int i = 3; i <= limit; i += 2) 
     if (isPrime(i)) 
      lastPrime = i; 
    System.out.println("2: Stopped generating at lastPrime= "+lastPrime); 
} 

// checking for primes 
public static boolean isPrime(int n) { 
    double sqrt = Math.sqrt(n); 
    for (int i = 2; i <= sqrt; i++) 
     if (n % i == 0) 
      return false; 
    return true; 
} 

它打印

1: Stopped generating at lastPrime= 39367 
1: Stopped generating at lastPrime= 55291 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
1: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 49603 
2: Stopped generating at lastPrime= 2039 
2: Stopped generating at lastPrime= 2039 
2: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 3 
2: Stopped generating at lastPrime= 3 
End of Main