我试图制作一个程序,使用Potion打印每个100K的奇数素数直到10M,我的代码:
last = 3
res = (last) # create array
loop:
last += 2
prime = true
len = res length -1
i = 0
while(i<len):
v = res at(i)
if(v*v > last): break.
if(last%v == 0): prime = false, break.
i += 1
.
if(prime):
res append(last)
if(res size % 100000 == 0): last print.
if(last>9999999): break.
.
.
但是这给了Segmentation fault (core dumped)
,我想知道出了什么问题?
供参考,工作Ruby版本:
res = [last=3]
loop do
last += 2
prime = true
res.each do |v|
break if v*v > last
if last % v == 0
prime = false
break
end
end
if prime
res << last
puts last if res.length % 100000 == 0
break if last > 9999999
end
end
输出应为:
1299721
2750161
4256249
5800139
7368791
8960467
不,这不是一个功课,只是出于好奇。
答案 0 :(得分:1)
我很糟糕,我从res length -1
更改时忘记从res length
更改为0 to len (i)
,因为此语法未被识别为循环(无法接收break
)。
last = 3
res = (last)
loop:
last println
last += 2
prime = true
len = res length
i = 0
while(i<len):
v = res at(i)
if(v*v > last): break.
if(last%v == 0): prime = false, break.
i += 1
.
if(prime):
res append(last)
if(res length % 100000 == 0): last print, "\n" print.
if(last>9999999): break.
.
.
答案 1 :(得分:1)
你自己发现了,太棒了!
药水中println
被称为say
。
它在res size
中崩溃了。
E.g。使用它来进行调试:
rm config.inc
make DEBUG=1
bin/potion -d -Dvt example/100thoddprime.pn
然后按Enter键直到崩溃。
(example/100thoddprime.pn:18): res append(last)
>
; (3, 5)
[95] getlocal 1 1 ; (3, 5)
[96] move 2 1 ; (3, 5)
[97] loadk 1 5 ; size
[98] bind 1 2 ; function size()
[99] loadpn 3 0 ; nil
[100] call 1 3Segmentation fault
因此res的大小返回nil,这导致了崩溃。
而不是last print, "\n" print.
只做last say.
这来自perl6语法,抱歉:)