1. 程式人生 > >程式基本演算法習題解析 使用篩選法求出1~100之內的所有素數

程式基本演算法習題解析 使用篩選法求出1~100之內的所有素數

思路:      

       第一個素數是2,把後面是2的整數倍的數全部篩去,篩去的數置0;從第一個素數2向後找出最小的未被篩去的數3,把它後面是3的整數倍的數全部篩去並置0;重複上述過程,直到新找到的素數大於100的平方根位置,至此,所有剩餘的未被篩去的數都是素數。 

附上程式碼:

// Chapter5_2.cpp : Defines the entry point for the application.
// 使用篩選法求出1~100之內的所有素數

#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
const int N = 100;

int main()
{
	int i,j,a[N+1],sq;
	sq = sqrt(N); //平方根
	//賦初值
	for(i=0;i<N+1;i++)
		a[i] = i;
	//從小到大選擇一個數,劃去後面是其整數倍的數(賦為0)
	for(i=2;i<=sq;i++)
	{
		if(a[i]!=0)
		{
			j=2*i;
			while(j<N+1)
			{
				a[j] = 0;
				j=j+i;
			}
		}
	}
	for(i=2;i<N+1;i++)
	{
		if(a[i]!=0)
			cout << a[i] << ' ';
	}
	cout << endl;
	system("pause");
	return 0;
}

首先,‘篩去’這一抽象概念我們可以用賦0來具體實現,之後只需要判斷該元素是否為0即可判斷其是否被篩去。

另外值得注意的是陣列的越界問題,之前將while(j<N+1)這個迴圈條件錯寫成了 j<=N+1,造成陣列賦值越界(a[N+1]),導致了一些莫名其妙的問題,除錯了許久才發現。不過也算是一筆財富,在今後的除錯中,如果覺得語法、邏輯都沒問題的情況下,執行結果始終不對,可以從數值越界這方面去找一下問題。

最後,執行結果如下: