为什么我这么写会报数组越界的错?

2020-12-03 11:26:06 +08:00
 gzk329
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++;
                    }

为什么我这么写会报数组越界的错?

1356 次点击
所在节点    问与答
7 条回复
zvl0reqglvd
2020-12-03 11:54:23 +08:00
应该没问题啊
raaaaaar
2020-12-03 12:14:23 +08:00
手机上看着要命
geelaw
2020-12-03 12:19:56 +08:00
溢出过了再转换,不会撤销溢出。
23571113
2020-12-03 12:21:14 +08:00
你把 j 的值打印出来看看,是不是变成负的了。
gzk329
2020-12-03 12:43:11 +08:00
n 取 499979
打印:i * (i + k)
打印结果:
.....
495607
496308
497009
497710
498411
499112
499813
-2146737495

确实
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 多余的。
leavebody
2020-12-03 16:06:38 +08:00
看成了“为什么我这么会写数组越界的错”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/731681

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX