[Nimrod] Re: Re: Nim埃氏筛法 →→→→→进入此内容的聊天室

来自 4n0n4me, 2023-01-15, 写在 Nimrod, 查看 79 次. 这张便签是回复 Re: Nim埃氏筛法 来自 4n0n4me - 对比版本
URL http://www.code666.cn/view/375a1bda
  1. # 又错了啦,我是傻逼
  2. import strutils, strformat
  3.  
  4. var
  5.     n = parseInt(readLine(stdin)) # 要求质数的范围上限
  6.     numbers: seq[Natural] = @[]   # 剩余未判断素性的数字
  7.     primes: seq[Natural] = @[]    # 质数们
  8.  
  9. for i in 2..n:
  10.     numbers.add(i) # 初始化
  11.  
  12. while len(numbers) > 0:
  13.     var
  14.         p = numbers[0] # 最小的质数
  15.         newNumbers: seq[Natural] = @[]
  16.  
  17.     if p * p > n:
  18.         break # 自己乘以自己都已经比上限的平方大了,那么自己啥也筛不到了,都被前面的因数筛完了
  19.         #自己是上一轮的幸存者,这一轮没有改变numbers,所以不需要加入素数
  20.  
  21.     primes.add(p) # 比自己小的都已经删掉或者进质数列表了,自己没被筛掉就是质数
  22.  
  23.     for i, v in numbers:
  24.         if v mod p != 0: # 不能被用来筛的质数整除,所以不知道是不是质数
  25.             newNumbers.add(v) # 接着筛
  26.         # 否则就淘汰,下一次不用筛了(这好像是一种优化过的方法,相当于欧式筛法的效果?)
  27.  
  28.     numbers = newNumbers
  29.  
  30.     echo &"numbers left: {numbers[0..min(10, high(numbers))]}... after sieved by {p}"
  31.  
  32. primes &= numbers # 把剩下的幸存者(一定是质数)捞上
  33.  
  34. echo "---Result---"
  35.  
  36. echo primes
  37.  

回复 "Re: Re: Nim埃氏筛法"

这儿你可以回复上面这条便签

captcha