我知道你们一定是想知道怎么用O(n)的算法找素数吧,这里先不急,看到最后你就会知道其中的原理。
先让我们看看平常我们是怎么找素数的(找1~n之间的素数):
for(int i=2,flag=1;i<=n;i++) {//枚举2~n的数,判断其是不是素数
for(int j=2;j*j<=i;j++) //此循环下都是判断是不是素数,时间复杂度为logn
if(i%j==0)
flag=0
if(flag)
cout<<i<<endl;
}
这段代码运用了我们平常用的判断素数的方法来找出了1~n的所有素数,时间复杂度为O(nlogn)
尽管时间复杂度已经很低,但依然不尽如人意,有没有更好的,时间复杂度更低的算法来找出素数了。
答案肯定是有的(不然你就不会看到这篇博客了)
在给出代码前先给出一个定理,任何一个正整实数都可以分解成如下的形式:
</