3 回答

TA贡献1886条经验 获得超2个赞
因为 when i == 46349
,j = i * i
溢出,你留下一个负数。循环条件仍然为真,但它超出了数组的边界,因此您会感到恐慌。
添加 afmt.Println(i, j)
作为嵌套循环中的第一条语句,并在本地机器上运行它(它会在沙箱上超时),你会看到它发生。

TA贡献1810条经验 获得超4个赞
i*i = 2148229801当i==46349. 有符号的 32 位整数2^31在变为负数之前只能达到 ~ (32 位 - 1 位符号)。具体来说,您的变量将采用(2^32)/2 - (46349^2)which is的值-746153。
如果您想执行此计算,请尝试使用 unsigned int 或 int64。
package main
// import "fmt"
func main() {
var limit uint
limit = 46349
limit++
sieved_numbers := make([]bool, limit)
var j uint = 0
var i uint = 2
for ; i < limit; i++ {
if !sieved_numbers[i] {
for j = i * i; j < limit; j += i {
sieved_numbers[j] = true
}
}
}
}
- 3 回答
- 0 关注
- 298 浏览
添加回答
举报