簡體   English   中英

根據Eratosthenes的Sieve的Java Prime計算器

[英]Java Prime calculator according to Sieve of Eratosthenes

我偶然發現了以下問題:我有一個要獲取並打印1到N之間的所有素數的類。N是您必須自己插入的參數。 當我為N插入10000時,代碼會工作並打印出所有素數(從2到最接近N的素數)。

當我插入40000時,代碼仍然有效。 當我插入50000(或更高版本)時,代碼給出ArrayOutOfBoundsException。 為什么?

這是我使用的代碼:

  ArrayList<Integer> priemGetallen = priemGetallen(n);
        for (Integer i : priemGetallen) {
              System.out.println(i);
        }

並使用

ArrayList<Integer> priemgetallen = new ArrayList<Integer>();

for(int i = 2; i < n; i++){
    priemgetallen.add(i);
}

for (int i = 2; i < n; i++) {
    for (int j = i; j * i <= n; j++) {
      if((j*i) < priemgetallen.size()){
          priemgetallen.remove(j*i);
        }
        }
   }
   return priemgetallen;
  }

我收到錯誤的地方是“ priemgetallen.remove(j * i)”。

如果有人能告訴我為什么這不適用於所有大於N的N,我將非常感激。 40000。

提前致謝!

Java int可以容納的最大值是2,147,483,647,因此當ij達到46,341時j * i溢出。

要擴展范圍,請將ijn的類型更改為long

請參閱Java如何處理整數下溢和溢出以及如何檢查整數?

PS您還需要將priemgetallen更改為Long而不是Integer的數組列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM