if ((long) i * i < n) {
for (int j = i * i; j < n; j += i) {
isPrime[j] = 0;
}
}
上面是官方的
while((long) (i * (i + k)) < n){
isPrime[i * (i + k)] = 0;
k++;
}
为什么我这么写会报数组越界的错?
1
zvl0reqglvd 2020-12-03 11:54:23 +08:00
应该没问题啊
|
2
raaaaaar 2020-12-03 12:14:23 +08:00 via Android
手机上看着要命
|
3
geelaw 2020-12-03 12:19:56 +08:00 via iPhone
溢出过了再转换,不会撤销溢出。
|
4
23571113 2020-12-03 12:21:14 +08:00
你把 j 的值打印出来看看,是不是变成负的了。
|
5
gzk329 OP n 取 499979
打印:i * (i + k) 打印结果: ..... 495607 496308 497009 497710 498411 499112 499813 -2146737495 确实 |
6
across 2020-12-03 13:25:38 +08:00
上面说溢出已经指明了吧。
啥语言?这里 long 应该是 64 位长度的吧,(long) i * i 是 long * int => long,没有溢出。 (long) (i * (i + k))在(i * (i + k))已经溢出了,转个 long 多余的。 |
7
leavebody 2020-12-03 16:06:38 +08:00
看成了“为什么我这么会写数组越界的错”
|