2017-05-04 143 views
0

我的程序使用了很多的內存和處理能力,我只能搜索到6000,是有什麼辦法可以減少內存使用這個量?這將有助於未來的編程工作,因爲知道如何巧妙處理內存將會很好。內存/ CPU優化?

ArrayList<Integer> factor = new ArrayList<Integer>(); 
    ArrayList<Integer> non = new ArrayList<Integer>(); 
    ArrayList<Integer> prime = new ArrayList<Integer>(); 

    Scanner sc = new Scanner(System.in); 
    System.out.println("Please enter how high we want to search"); 
    long startTime = System.nanoTime(); 
    int max = sc.nextInt(); 
    int number = 2; 

while (number < max) 
{ 

     for (int i=0;i<prime.size();i++) 
    { 
      int value = prime.get(i); 
      if (number % value == 0) 
     { 
      factor.add(value); 
     } 
     else 
     { 
      non.add(value); 
     } 
    } 

    if(factor.isEmpty()) 
    { 
     prime.add(number); 
    } 
    else 
    { 
     composite.add(number);   
    } 
    factor.clear(); 
    number++; 


} 
    int howMany=prime.size(); 
    System.out.printf("The are "+howMany+" prime numbers up to " +max + " and they are: " +prime); 
    System.out.println(); 

} 
+1

什麼編程語言,這是?它是Java嗎?請用正在使用的語言標記您的問題。要更新您的問題,請點擊帖子下的**「[edit]」**鏈接。謝謝。 – Pang

回答

0

你不會說你正在使用什麼語言,所以這個答案將是一般性的。

要想存儲素數高達6000只需要大約3000位小於380個字節。你的基本解決方案是Eratosthenes的篩子,以及2是唯一的素數。你設置篩子只處理奇數,這就將所需的存儲減半。由於篩子對每個奇數只保持素數或不素數,因此每個數字的存儲可以減少到一位。

一旦你已經設置了篩子,有很多網站包括本該有不同的語言說明,你只需要檢索從篩爲您範圍內的號碼總理/首相沒有價值。假設已經設置篩網,這裏是用於檢查數字是否爲素數的僞代碼:

boolean function isPrime(number) 

    // Low numbers 
    if (number < 2) 
    return false 
    endif 

    // Even numbers 
    if (number is even) 
    return number == 2 
    endif 

    // Odd numbers >= 3 
    return sieve[(number - 1)/2] == 1 

end function 

低數字不是素數。 2是唯一的素數;所有其他偶數不是素數。奇數2n + 1的主標誌存儲在篩網的第n位。這假定您使用的語言允許位級別的訪問,例如Java中的BitSet