【问题标题】:How to write a function that lists prime numbers using the sieve of Eratosthenes如何使用 Eratosthenes 的筛子编写列出素数的函数
【发布时间】:2013-04-25 18:52:22
【问题描述】:

我应该编写一个函数或脚本,使用“埃拉托色尼筛”找到所有小于给定整数 n>2 的素数 p,从而避免不必要的存储(我可以创建长度为 n 但不能更多的向量)

n = input('Enter your number');
v=[1:n];
v(1)=0
for i=2:n
    s=0;
    for j=v(2)
        if i>v(2) &&  mod(i,j)==0
           s=s+1;
        end
    end
    if s>0
      v(i)=0;
    end
end
for i=v(v>v(find(v,1,'first'))):n
s=0;
    for j=v(v>v(find(v,1,'first')))
        if i>v(v>v(find(v,1,'first'))) & mod(i,j)==0
           s=s+1
        end
    end
    if s>0
      v(i)=0;
    end 
end     

v

我意识到这与我应该编写的代码相去甚远。但这是我想到的唯一想法,它只删除可被 2 和 3 整除的数字,我需要通过对每个条目重复此操作来找到所有素数。这显然不聪明。但我觉得可以为此创建一个循环。但我没有编写这个循环。请帮忙。

【问题讨论】:

  • 您的具体问题是什么?请具体说明,“为我解决这个问题”不是一个好的 SO 问题。

标签: matlab primes sieve-of-eratosthenes


【解决方案1】:

这是伪代码(对不起,我不知道matlab)。我在wikipedia 上查看了算法,并在 Java 中对其进行了测试。

fill your array with numbers from 2 to N

p=2
while p<=n
    for i=2*p, while i<=N, increment i=i+p
        mark element as 0
    end for
    increment p by 1
end while

print all array elements that are not 0

【讨论】:

  • WP 还说最好从 p*p 开始。 :)
  • 我同意。如 WP 所述,他也可以在数组中只使用奇数
【解决方案2】:

翻译 Goran Belfinger 对 Matlab 的回答中的代码(恐怕我无法按照您的 OP 中的代码进行操作):

N = input('Enter your number: ');

primes = 2:N;
p=2;

while (p <= N)
    for i = 2*p:p:N
        primes(i - 1) = 0;
    end;
    p = p + 1;
end

primes = primes(primes > 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-12
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多