[the summarization of algorithm]How to list the prime number

In order to get the list of prime number, I find some ways to do that.


素數判定法:

1、樸素的方法:

#include<stdio.h>

bool isprime(int n);//判斷是否是質數的函數

int main()
{
	int n;
	scanf("%d",&n);
	if(isprime(n))
		printf("%d is a prime.\n",n);
	else
		printf("%d isn't a prime.\n",n);
	return 0;
}

bool isprime(int n)
{
	int i;
	for(i = 2;i < n; i++)//原理:利用質數的定義:質數是隻能被1和其本身整除的數
	{
		if(n % i == 0)
			break;
	}
	if(i == n)
		return true;
	else
		return false;
}

複雜度:o(n)


2、對樸素的方法的一階優化:
bool isprime(int n)
{
	int i;
	for(i = 2;i < n/2; i++)//一階改進原理:只要2至n/2之間的數都不能被n整除,那麼n就是質數(因爲n/(n/2) = 2,n/((n/2)+k)<2)(k>0)
	{
		if(n % i == 0)
			break;
	}
	if(i == n/2)
		return true;
	else
		return false;
}

複雜度:o(n/2)


3、對樸素的方法的二階優化:

bool isprime(int n)
{
	int i;
	for(i = 2;i <= (int)sqrt((double)n); i++)//改進原理:只要2至根號n之間的數不能被n整除,n即爲質數。
	{
		if(n % i == 0)
			break;
	}
	if(i == (int)sqrt((double)n)+1)
		return true;
	else
		return false;
}
原理:若n(n∈N,n>1)不能被小於根號n的所有質數整除,則n爲質數。
複雜度:O(sqrt(n))
解釋:非質數都可以分解爲更小的質數乘積的形式,至於爲什麼是根號n,因爲假如x=ab的話,那麼ab一定一個小於等於根號另一個大於等於,所以a>根號n的時候b一定<根號n,所以到根號就相當於把所有可能的a都測試過一遍了。

4、埃拉托色尼篩選法(The sieve of Eratosthenes)

埃拉托色尼選篩法(the Sieve of Eratosthenes)簡稱埃氏篩法,是古希臘數學家埃拉托色尼(Eratosthenes 274B.C.~194B.C.)提出的一種篩選法。 是針對自然數列中的自然數而實施的,用於求一定範圍內的質數。

步驟:1)先把1刪除(現今數學界1既不是質數也不是合數)

   2)讀取2,並把2的倍數刪除

   3)讀取3,並把3的倍數刪除

   4)讀取5,並把5的倍數刪除(4是2的倍數,在第2步已經被刪除)

   5)如上所述,直到所需範圍你所有數字被讀取過

Sieve of Eratosthenes

#include<stdio.h>
#include<stdlib.h>
#define N 1000     //N以內的素數表
int main()
{
	bool chart[N+1];
	for(int i = 2;i<N;i++)
	{
		if(chart[i])
			for(int j = 2*i;j<N;j+=i)
				chart[j] = false;
	}
	for(int i = 2;i<N;i++)
	{
		if(chart[i])
			printf("%d\n",i);
	}

	return 0;
}

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