1. 程式人生 > >篩法求N以內所有質數

篩法求N以內所有質數

題目:打印出給定數N以內的所有質數

解答:

使用篩法求N以內的所有質數

注意:

  1. 使用bitmap可以減少使用的空間,降低空間複雜度

程式碼:

#include <iostream>
#include <string.h>
using namespace std;

#define MAX 5000

int array[MAX];//使用bitmap

void setArray(int i)//設定bitmap位
{
	array[i / 32] = array[i / 32] | (0x0001 << (i % 32));
}

void clrArray(int i)//清楚bitmap位
{
	array[i / 32] = array[i / 32] ^ (0x0001 << (i % 32));
}

bool checkArray(int i)//檢查某位是不是存在數
{
	if(array[i / 32] & (0x0001 << (i % 32)))
		return true;
	return false;
}

void getNum(int num)//篩法
{
	if(num < 2)
		return;

	for(int i = 2; i <= num; i++)
		setArray(i);

	for(int i = 2; i <=num; i++)
	{
		if(checkArray(i))
		{
			for(int j = i; j <= num / i; j++)
			{
				if(checkArray(i * j))
					clrArray(i * j);
			}
		}
	}
}

int main()
{
	int num;
	while(1)
	{
		cin >> num;
		getNum(num);
		for(int i = 2; i <= num; i++)
			if(checkArray(i))
				cout << i << " ";
		cout << endl;
	}
	return 0;
}