求100以內素數的方法(篩選法,窮舉法,窮舉法優化)

一、基本思想

//質數(素數)是指在大於1的自然數中除了1和它本身以外不再有其他因數的自然數。

(1)判斷一個數n是不是素數,可以用2到(int)sqrt(n)之間的所有整數去除n,看能否整除,如果都不能整除,那麼n是素數(慢)

(2)窮舉法優化就是減少了不必要的窮舉

(3)篩法求素數:把2到n的多有數都存到數組裏,從2開始,先劃掉n內所有2的倍數,然後每次從下一個剩下的數(必然是素數)開始,劃掉其n內所有的倍數,最後剩下的數,就都是素數。

具體到程序:

1.可以設置一個標記數組isPrime,isPrime[i]的值是1,就表示是素數;

 2.劃掉k的倍數,就是把isPrime[2*k],isPrime[3*k]...置成0;

3.最後檢查isPrime數組,輸出isPrime[i]爲1的那些i。

這種方法:空間換時間,加快了速度,對於大量數的計算效果尤爲明顯

以下爲兩種方法的程序:

#include<stdio.h>
#include<math.h>
//質數(素數)是指在大於1的自然數中
//除了1和它本身以外不再有其他因數的自然數。
int IsPrime(int m){//普通方法求素數 
	int sq,i;
	sq=(int)sqrt(m);//注意取整 
	for(i=2;i<=sq;i++){//注意i<sq錯誤 
		if(m%i==0){
			return 0;
		}
	}
	return 1;
}
int main(void){
	int m,j;
	scanf("%d",&m);
	if(IsPrime(m)){
		printf("Yes,it is prime\n");
	}
	else{
		printf("No!\n");
	}
	for(j=2;j<=100;j++){
		if(IsPrime(j))
			printf("%4d",j);
	} 
	return 0;
}
#include<math.h>
#include<stdio.h> 
int main(){//優化窮舉法求100以內的全部素數
	int i,sq; 
	printf("%3d",2);//2是素數 
	for(i=3;i<=100;i+=2){//每次判讀i是否爲素數 
		int k;//偶數一定不是素數故跳過 
		sq=(int)sqrt(i);
		for(k=3;k<=sq;k+=2){//不檢查是否能被偶數整除 
			if(i%k==0){//如果不是素數,跳出本循環體 
				break;
			}
		}
		if(k>sq)//如果k>sq,說明檢查完所有數,都沒有被整除 
			printf("%3d",i);
	}
	return 0;
}

 

#include<stdio.h>//篩選法求素數 
#define MAX_NUM 100
char isPrime[MAX_NUM+10];//避免數組越界?
//最終如果isPrime[i]爲1,表示i是素數 
int main(void){
	int i,j;
	for(i=2;i<=MAX_NUM;++i)//假設所有的數都是素數 
		isPrime[i]=1;
	for(i=2;i<=MAX_NUM;++i){
		if(isPrime[i])//避免重複去掉數,只標記素數的倍數 
			for(j=2*i;j<=MAX_NUM;j+=i){
				isPrime[j]=0;//將素數的倍數標記爲非素數 
			}
			
	}
	for(i=2;i<=MAX_NUM;++i)
		if(isPrime[i])
			printf("%-3d",i);
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章