找到每100K素数打印奇数素数

时间:2015-03-17 04:49:14

标签: primes potion

我试图制作一个程序,使用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

不,这不是一个功课,只是出于好奇。

2 个答案:

答案 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语法,抱歉:)