比特集(JAVA)在实现Eratosthenes的筛子时抛出了BoundsException
这是我的函数,用于执行Eratosthenes的筛选比特集(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);
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