2011-03-10 21 views
0

我使用下面這個基本和原油代碼計算素數,然後它們導出到文本文件:如何使用BigInterger在我的代碼中計算素數?

import java.util.Scanner; 
import java.io.*; 


public class primeGenerator{ 

    public static void main(String[] args)throws Exception { 
     Scanner kb = new Scanner(System.in); 
     String prime; 
     long num = kb.nextLong(); 
     long i; 
     long z=0; 
     while(z==0){ 

      for (i=2; i < num ;i++){ 
       long n = num%i; 
       if (n==0){ 

        break; 
       } 
      } 
      if(i == num){ 
       writer(num); 

      } 
      num=num+2; 
     } 
    } 

    public static void writer(long num) throws Exception { 

      FileWriter writer = new FileWriter("prime.txt",true); 
      String prime= ""+ num; 
      writer.write(prime); 
      writer.write(" "); 
      writer.flush(); 
      writer.close(); 


    } 
} 

我想找到超越了靈長類動物的長的範圍內的素數,顯然大整數的方式去做吧。那麼,我如何改變我的代碼呢?

+1

你想要做什麼? – st0le 2011-03-13 09:05:37

回答

1

那麼,無論你目前有long,那麼使用BigInteger。而不是使用%的您將使用mod,而不是增加您將使用i = i.add(BigInteger.ONE),而不是== 0,你將使用equals(BigInteger.ZERO)

使用Scanner.nextBigInteger代替Scanner.nextLong了。

鑑於這看起來像某些描述的作業(當然可能是自行設定的),我不會爲您寫出整個代碼 - 但如果您遇到特定問題,請隨時提問。

+1

另外一個:BigInteger是不可變的。這意味着如果你做myBigInt.add(anotherBigInt)myBigInt的值沒有改變。您需要複製返回值,如Jon上面所示。雖然這在JavaDoc中已經清楚地說明了,但我覺得它應該有所提高。 – 2011-03-10 09:49:46

3

你真的需要這個嗎?數字大於long意味着你想要測試大於9223372036854775807的數字。如果你的for-loop可以測試每秒數億次的分割,它仍然需要2923年才能確定這個數字是否爲素數 - 當然,對於更大的數字更長。

一個常見的優化是隻測試到sqrt(num)的分割。如果你還沒有找到任何東西,那麼這個數字就是質數。

+0

另外,我建議緩存你發現並重復使用的素數以避免不必要的分裂(例如,如果某些東西不能被3除以9除)。 – ArtB 2012-02-09 02:51:33

相關問題