<p>你的算法是分别检查从2到N(其中N=2000000)的每个数字的素性。</p>
<p>Snippet-1使用了2200年前发现的<strong><a href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes" rel="nofollow noreferrer">sieve of Eratosthenes</a></strong>算法。
它不检查每个号码,但:</p>
<ul>
<li>对2到2000000的所有数字进行“筛选”。</li>
<li>找到第一个数字(2),将其标记为素数,然后从筛选中删除其所有倍数。</li>
<li>然后找到下一个未删除的数字(3),将其标记为素数,并从筛选中删除其所有倍数。</li>
<li>然后找到下一个未删除的数字(5),将其标记为素数,并从筛选中删除其所有倍数。</li>
<li>。。。</li>
<li>直到找到素数1409并从筛子上删除它的所有倍数。</li>
<li>然后找到了1414~=sqrt(2000000)的所有素数,它停止了</li>
<li>从1415到2000000的数字不需要检查。所有没有被删除的都是素数。</li>
</ul>
<p>因此该算法产生了N以内的所有素数</p>
<p>注意,它不做任何除法,只做加法(甚至不做乘法运算,而且它对这么小的数并不重要,但对较大的数可能很重要)。时间复杂度是<code>O(n loglogn)</code>,而你的算法有一些接近<code>O(n^(3/2))</code>(或者<code>O(n^(3/2) / logn)</code>,正如@Daniel Fischer评论的那样),假设除法的成本与乘法相同。</p>
<p>来自维基百科(链接在上面)的文章:</p>
<blockquote>
<p>Time complexity in the random access machine model is O(n log log n) operations, a direct consequence of the fact that the <a href="http://en.wikipedia.org/wiki/Prime_harmonic_series" rel="nofollow noreferrer">prime harmonic series</a> asymptotically approaches <code>log log n</code>.</p>
</blockquote>
<p>(在这种情况下,<code>n = 2e6</code>)</p>