大家好,又见面了,我是你们的朋友全栈君。
LeetCode上有一道题:给出一个数 n ,求(0, n)之间素数的个数。然后我采用埃拉托斯特尼筛法在每次找到一个素数时,将能被素数整除的数排除掉。但是,在进行int类型转换的时候会报:java.lang.ArrayIndexOutOfBoundsException
代码如下:
public int countPrimes(int n) {
boolean[] notPrimes = new boolean[n + 1];
int count = 0;
for(int i = 2; i < n; i++){
if(notPrimes[i]){
continue;
}
count++;
//for(long j = (long) (i * i); j < n; j += i) 会报错
for(long j = (long)i * i; j < n; j += i){
notPrimes[(int)j] = true;
}
}
return count;
}
原因是:java中,int类型为32位,范围 -2^31-1~2^31,当超出这个范围会发生数据溢出,得到错误的数据,然后再转型为long型。所以是先转型再计算。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135675.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...