每找到 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 语法,抱歉 :)