1. 程式人生 > >求範圍內質數(素數)

求範圍內質數(素數)

素數定義:除了1和自身之外,不能被其他整數整除。

方法1:質樸的方法,重複呼叫的方法是判斷一個數是不是質數。當求一個數是不是質數時,這種方法是正確的,也沒有優化空間,但是當求一個區間內的質數時,可以進行優化。

方法2:方法1存在的問題是,沒有有效利用已經確定的資訊,也即對後續數字判斷時無法利用已經求得的資訊。如若判斷某一數字為質數,那麼以它為因子的所有數,都不會是質數,故將其剔除。(若想換區時間,必須消耗空間)

總結:方法1是找出所有質數;方法2是剔除所有非質數,判斷是否是非質數,雖然不復雜,但是會重複判斷,故用質數作為因子減少重複的情況。

#include<iostream>
#include<vector>
using namespace std;
bool check(int num)
{
	for (int i = 2; i*i <= num; i++)
	{
		if (num%i == 0)
		{
			return false;
		}
	}
	return true;
}
int countprimes(int n)
{
	if (n < 2) return 0;
	int num = 0;
	vector<bool> flag(n+1,true);
	for (int i = 2; i <= n; i++)
	{
		if (flag[i])
		{
			num++;
			cout << i << " ";
			for (int j = i*i; j <= n; j += i)    //剔除非質數,注意從i*i開始,每次加i
			{
				flag[j] = false;
			}
		}

	}
	return num;
}

int main()
{
	cout << "方法1" << endl;
	for (int i = 2; i <= 100; i++)
	{
		if (check(i)) cout << i << " ";
	}
	cout << endl;
	cout << "方法2" << endl;
	countprimes(100);
	system("pause");
	return 0;
}