0

我偶然发现了以下问题:我有一个类可以获取和打印 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,我将非常感激。40000。

提前致谢!

4

1 回答 1

4

Javaint可以容纳的最大值是 2,147,483,647,所以在和达到 46,341j * i时溢出。ij

要扩展范围,请将 和 的i类型j更改nlong

请参阅Java 如何处理整数下溢和溢出以及如何检查它?

PS您还需要更改priemgetallen为数组列表,Long而不是Integer.

于 2014-10-21T15:35:36.757 回答