1. 程式人生 > >利用埃拉託斯特尼篩法求1-n之間的素數

利用埃拉託斯特尼篩法求1-n之間的素數

定義:

        素數又稱質數,素數定義為在大於1的自然數中,除了1和它本身以外不再有其他因數。

方法:

        採用埃拉託斯特尼篩法,每次消去2、3、4、5 、6 、、、、、、的倍數,直到沒有可消的為止,剩下的數字則為素數;

        每次考慮消去的第一個數為p*p, p<=sqrt(n); 

        時間複雜度為O(n*logn);空間複雜度O(n)。

程式碼:

#include <stdio.h>
#include <math.h>

const int MAX = 10000;//定義n的最大值 
int prime[MAX];
int n; 
/*
	採用埃拉託斯特尼篩演算法:
	依次消去2、3、4、5、6、、、、、的倍數,直到沒有消的為止;
	每次考慮消去的第一個數p*p,p<=sqrt(n); 
*/ 
void get_prime(){
	for(int i = 2; i <= sqrt(n); i++){
		int k = i;
		for(int j = i * i; j <= n; j = i * k ){
			prime[j] = 0;//將非素數標記為0; 
			k++; 
		}
	}	
}

int main() {
	while(scanf("%d",&n) == 1 && n) {
		for(int i = 0; i <= n; i++) {
			prime[i] = i;
		}
		get_prime();
		for(int i = 0; i<=n; i++) {
			if(prime[i] != 0) {
				printf("%5d",prime[i]);
			}
		}
		printf("\n");
	}	
	return 0;
}