比特集(JAVA)在实现Eratosthenes的筛子时抛出了BoundsException

比特集(JAVA)在实现Eratosthenes的筛子时抛出了BoundsException,java,indexoutofboundsexception,bitset,sieve-of-eratosthenes,Java,Indexoutofboundsexception,Bitset,Sieve Of Eratosthenes,这是我的函数,用于执行Eratosthenes的筛选 void solve() throws IOException { int n = 200000; ArrayList<Integer> primes = new ArrayList<Integer>(); BitSet bs = new BitSet(n + 1); for(int i = 0; i <= n + 1; i++) bs.set(i);

这是我的函数,用于执行Eratosthenes的筛选

void solve() throws IOException {

    int n = 200000;

    ArrayList<Integer> primes = new ArrayList<Integer>();
    BitSet bs = new BitSet(n + 1);

    for(int i = 0; i <= n + 1; i++)
        bs.set(i);

    //setting bits at 0 and 1 to 0, since these are not considered as primes
    bs.clear(0);
    bs.clear(1);

    for(int i = 2; i <= n + 1; i++) {
        if(bs.get(i)) {
            //cross out multiples of i starting from i*i (lesser one would have always been crossed out)
            for(int j = i*i; j <= n + 1; j += i)
                {
                    bs.clear(j);
                }

            primes.add(i);          //add this prime to the list

        }
    }

    for(int e : primes)
        out.println(e);
}
void solve()引发IOException{
int n=200000;
ArrayList primes=新的ArrayList();
位集bs=新位集(n+1);

对于(int i=0;i我认为这可能是因为你使用了一个int,而这个数字变得太大了


200000*200000是一个巨大的数字,应该是一个很长的数字。

我认为这可能是因为你使用的是整数,而这个数字变得太大了


200000*200000是一个巨大的数字,应该是一个很长的数字。

这一行中有一个整数溢出(
i*i
为负数):

印刷品:

-1840771072

这是负数,因此小于
n+1
并通过循环条件。

这一行中有一个整数溢出(
i*i
为负数):

印刷品:

-1840771072
它是负数,因此小于
n+1
,并通过循环条件。

您正在初始化变量
i
,使其成为接近200000的大数字(特别是大素数?)。这意味着初始化为
i*i
j
,将超过40000000000,大大超过
int
的最大值(约2147000000),这意味着它们将溢出为负值,这肯定超出范围

要解决这种情况下的问题,请将变量声明为
long
类型,该类型为64位,可以容纳更大的值。

您正在初始化(在最坏的情况下)变量
i
为接近200000的大数(特别是大素数?)。这意味着初始化为
i*i
j
,将超过40000000000,大大超过
int
的最大值(约2147000000),这意味着它们将溢出为负值,这肯定超出范围


要解决本例中的问题,请将变量声明为
long
类型,该类型为64位,可以容纳更大的值。

在本例中不要使用double,您需要精确值。继续。在本例中不要使用double,您需要精确值。继续。是的,但要访问位集,您需要整数值索引,因此,even如果你声明变量,只要你仍然必须将其转换为int。不确定这是否能解决问题。但是cast会改变32位数字的长值是的,但要访问位集,你需要整数值索引,因此,即使你声明变量,你仍然必须将其转换为int。不确定这是否能解决问题em.但cast将更改32位数字的长值
for(int j = i*i; j <= n + 1; j += i)
System.out.println(168000 * 168000);
-1840771072