运行时打印N下的所有素数

时间:2010-10-30 16:18:52

标签: algorithm

int main() {
      int i, a[N];
      // initialize the array
      for(i = 2; i < N; i++) a[i] = 1;
      for(i = 2; i < N; i++)
         if(a[i])
              for(int j = i; j*i < N; j++) a[i*j] =0;
       // pirnt the primes less then N
       for(i = 2; i < N; i++)
           if(a[i]) cout << "  " << i;
       cout << endl;
}

在算法书中给出了我正在阅读上述程序的运行时间与N+N/2+N/3+N/5+N/7+N/11+...成正比,

请帮助我理解作者如何从程序中得出上述等式。 谢谢! 文卡塔

3 个答案:

答案 0 :(得分:3)

这是寻找素数的“Eratosthenes筛选”方法。对于每个素数,if(a[i])测试成功并且内部循环被执行。考虑这个内循环在每个步骤终止的方式(记住,条件是j*i < N,或等价地,j < N/i):

  • i = 2 - &gt; j = 2,3,4,...,N / 2
  • i = 3 - &gt; j = 3,4,5,...,N / 3
  • i = 4 - &gt;
  • i = 5 - &gt; j = 5,6,7,...,N / 5
  • ...

总计操作总数(包括初始化数组/提取素数)给出了本书中提到的运行时。

有关详细信息,请参阅this question,包括讨论如何根据位{{3}转换为O(n(log n)(log log n)的扩展}。

答案 1 :(得分:1)

该算法称为Eratosthenes的Sieve。这张图片解释了一切:

Sieve of Eratosthenes

(来自维基百科)

答案 2 :(得分:0)

内部循环(内部if(a[i]))仅针对素数i执行。即,i等于2,3,5,7,1 ......,对于单i,此循环具有大约N/i次迭代。因此,我们总体上进行了N/2 + N/3 + N/5 + N/7 + N/11 + ...次迭代。