筛选法求素数
篩選法求素數要比普通的求素數方法更加快速,雖然在一些小范圍內看不出多大差別,但是當范圍大到一定程度,普通求素數的方法就會顯得比較耗時,在做一些編程題的時候特別容易超時
我們就拿1000以內的素數來說
可以看到1000以內的每一個數都要進行一次第二個for循,而且第二個for循環每一次都要循環完,這樣就耗時
接下來用篩選法求素數來試試 #include<iostream> using namespace std; int main() {int a[1000]={0};//這里最好初始化一下,因為有時候取數組大了數組里邊的初始值不是0而是一些后臺的垃圾數據int b[1000]={0};int cnt=0;for(int i=2;i<1000;i++){if(a[i]==0){b[cnt++]=i;for(int j=2;i*j<1000;j++)a[j*i]=1;//所有是素數的倍數的數都可以去除}}for(int i=0;i<cnt;i++)cout<<b[i]<<endl;}可以看出來代碼明顯要短,可能代碼比普通代碼要難理解一點
至于為啥它不用再從2~n每一個都除一遍,因為每一個不是素數的數都是由一些比自己小的兩個整數相乘得到
篩選法求素數又是從2(本身是素數)開始,之后的像4,6,8,都會因為是2的倍數而使a[4],a[6],a[8]的值從0變成1;
不用進行判斷,以此類推那些比自己小的數只要不是素數都已經使數組對應值變成1,由此把所有素數找出來,比普通的要簡單多
總結
- 上一篇: 我这么讲线索二叉树,我三岁大的表弟笑了笑
- 下一篇: JDBC有这一篇就够了(万字JDBC附代