1. 程式人生 > 實用技巧 >用篩選法求100之內的素數

用篩選法求100之內的素數

用篩選法求100之內的素數

【答案解析】

素數:約數為1和該數本身的數字稱為素數,即質數

篩選法:又稱為篩法。先把N個自然數按次序排列起來。1不是質數,也不是合數,要劃去。第二個數2是質數留下來,而把2後面所有能被2整除的數都劃去。2後面第一個沒劃去的數是3,把3留下,再把3後面所有能被3整除的數都劃去。3後面第一個沒劃去的數是5,把5留下,再把5後面所有能被5整除的數都劃去。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部質數。因為希臘人是把數寫在塗臘的板上,每要劃去一個數,就在上面記以小點,尋求質數的工作完畢後,這許多小點就像一個篩子,所以就把埃拉託斯特尼的方法叫做“埃拉託斯特尼篩”,簡稱“篩法”。(另一種解釋是當時的數寫在紙草上,每要劃去一個數,就把這個數挖去,尋求質數的工作完畢後,這許多小洞就像一個篩子。)

【程式碼實現】

//用篩選法求100以內的素數
#include<stdio.h>
int main()
{
	int i, j, k = 0;

	// 將陣列彙總每個元素設定為:1~100
	int	a[100];
	for (i = 0; i < 100; i++)
		a[i] = i+1;

	// 因為1不是素數,把a[0]用0標記
	// 最後一個位置數字是100,100不是素數,因此迴圈可以少迴圈一次
	a[0] = 0;
	for (i = 0; i < 99; i++)
	{
		// 用a[i]位置的數字去模i位置之後的所有資料
		// 如果能夠整除則一定不是素數,該位置資料用0填充
		for (j = i + 1; j < 100; j++)
		{
			if (a[i] != 0 && a[j] != 0)
			{
				//把不是素數的都賦值為0
				if (a[j] % a[i] == 0)
					a[j] = 0;
			}
		}
	}

	printf(" 篩選法求出100以內的素數為:\n");
	for (i = 0; i < 100; i++)
	{
		//陣列中不為0的數即為素數
		if (a[i] != 0)
			printf("%3d", a[i]);
	}

	printf("\n");
	return 0;
}

執行結果