程式基本演算法習題解析 使用篩選法求出1~100之內的所有素數
阿新 • • 發佈:2018-12-18
思路:
第一個素數是2,把後面是2的整數倍的數全部篩去,篩去的數置0;從第一個素數2向後找出最小的未被篩去的數3,把它後面是3的整數倍的數全部篩去並置0;重複上述過程,直到新找到的素數大於100的平方根位置,至此,所有剩餘的未被篩去的數都是素數。
附上程式碼:
// Chapter5_2.cpp : Defines the entry point for the application. // 使用篩選法求出1~100之內的所有素數 #include "stdafx.h" #include<iostream> #include<math.h> using namespace std; const int N = 100; int main() { int i,j,a[N+1],sq; sq = sqrt(N); //平方根 //賦初值 for(i=0;i<N+1;i++) a[i] = i; //從小到大選擇一個數,劃去後面是其整數倍的數(賦為0) for(i=2;i<=sq;i++) { if(a[i]!=0) { j=2*i; while(j<N+1) { a[j] = 0; j=j+i; } } } for(i=2;i<N+1;i++) { if(a[i]!=0) cout << a[i] << ' '; } cout << endl; system("pause"); return 0; }
首先,‘篩去’這一抽象概念我們可以用賦0來具體實現,之後只需要判斷該元素是否為0即可判斷其是否被篩去。
另外值得注意的是陣列的越界問題,之前將while(j<N+1)這個迴圈條件錯寫成了 j<=N+1,造成陣列賦值越界(a[N+1]),導致了一些莫名其妙的問題,除錯了許久才發現。不過也算是一筆財富,在今後的除錯中,如果覺得語法、邏輯都沒問題的情況下,執行結果始終不對,可以從數值越界這方面去找一下問題。
最後,執行結果如下: