每找到 100K 个素数就打印奇数素数
Printing odd prime every 100K primes found
我正在尝试制作一个程序,使用 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 to len (i)
更改时忘记从res length -1
更改为res length
,因为此语法无法识别为循环(无法接收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.
.
.
你自己发现的,太棒了!
println
在药水里叫做say
。
它在 res size
.
中崩溃了
例如使用它进行调试:
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 语法,抱歉 :)
我正在尝试制作一个程序,使用 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 to len (i)
更改时忘记从res length -1
更改为res length
,因为此语法无法识别为循环(无法接收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.
.
.
你自己发现的,太棒了!
println
在药水里叫做say
。
它在 res size
.
例如使用它进行调试:
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 语法,抱歉 :)