求素數的幾種方法(通俗易懂)

博主簡單的寫下這篇文章,主要爲了更好地複習和理解,希望對各位有幫助。

素數:指一個只能被1和它本身整除的數。

青銅級別求素數:枚舉範圍內的每個數在2到本身的範圍中是否有被整除的數。沒有就是素數,有就不是素數。

int IsPrime(int n){
	int i;
	if(n <= 1)  return 0;
	if(n==2) return 1;
	for(i = 2;i < n;i++)  if(n%i==0) return 0;
	return 1; 
}

白銀級別求素數:此法與第一種差不多,唯一變化就是枚舉是否有被整除的數的範圍。由於2*4=8與4*2=8是一樣的,減少重複,提高程序效率。

int IsPrime(int n){
    int i;
	if(n <= 1) return 0;
	if(n==2) return 1;
	for(i=2;i<=n/2;i++) if(n%i==0) return 0;
	return 1; 
}

黃金級別求素數:由於所有素數(除了2)都是從奇數中出現。所以我們可以先去掉偶數,再篩選,這樣的效率就會更高一點

int IsPrime(int n){
	int i;
	if(n==2) return 1;
	if(n<=1||n%2==0) return 0;
	for(i=3;i<=n/2;i+=2)if(n%i==0) return 0;
	return 1; 
}

鉑金級別求素數:求素數方法同上一種,在範圍內找素數,去掉此範圍中的偶數。如for(int i=3;i<=1000;i+=2),找1000以內的素數

鑽石級別求素數:

int IsPrime(int n){
	int i;
	if(n%2==0) return 0;
	for(i = 3;i <= sqrt(n);i+=2) if(n%i==0) return 0;
	return 1; 
}

星耀級別求素數:標記範圍內所有數,然後判斷

1)去掉2的倍數;2)去掉3的倍數;3)去掉4的倍數(不需要,第一步已經去掉了)....直到不能去掉爲止。

void IsPrime(int n){
	int i,j;
	for(i=2;i<=n;i++) prime[i]=1;
	for(i=2;i<=n;i++){
		if(prime[i]) printf(" %d ",i);
		for(j=i+i;j<=n;j+=i) prime[j] = 0;
	}
}

王者求素數:

1)定義一個數組a去存儲素數。然後不斷去標記範圍內不是素數的數(也就是素數的倍數a[j]*i)。

2)i%a[j]==0,使任一個合數,只能被它的最小質因數(18=2*3*3,最小質因數爲2)標記一次。因爲一遇到最小質因數a[j]就跳出。

void IsPrime(int n){
	int i,j,len=0;
	for(i=0;i<n;i++) prime[i]=1;///初始化prime

	for(i=2;i<=n;i++){
        if(prime[i]) {
        a[len++]=i;
        printf("%d ",i);
        }
        for(j=0;j<len&&a[j]*i<=n;j++) {
            prime[a[j]*i]=0;
            if(i%a[j]==0) break;
        }
	}
}

以上就是求素數的幾種方法,一般來說,我們都是選最後兩種方法。

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