求素数的几个方法

#define  N  100000000
求1~N中的素数个数;

// 方法一: 直接判断n是否为素数 n为正整数</span>
bool IsPrime1(int n)                  // 在VS2010中运行时间为239秒
{
	int i;
	if (n == 1)		return false;
	for (i = 2; i * i <= n; i++)
		if (n % i == 0)		return false;
	return true;
}

// 方法二:直接判断n是否为素数 n为正整数
bool IsPrime2(int n)		     // 在VS2010中运行时间为121秒
{
	int i;
	if (n == 1)			return false;
	if (n == 2)			return true;
	if (n % 2 == 0)		return false;

	for (i = 3; i * i <= n; i += 2)
		if (n % i == 0)		return false;
	return true;
}

<pre name="code" class="cpp">/*
** 筛选法一:
** 开一个大的bool型数组prime[],大小为n+1.
** 先把所有的下标为奇数的标为true,下标为偶数的标为false
*/
void IsPrime3(int n, bool prime[])	// 在VS2010中运行时间为3秒
{
	int i, j;

	for (i = 3; i <= sqrt(1.0 * n); i += 2)
	{   
		if(prime[i])
		{
			for (j = i + i; j <= n; j += i) 
			prime[j] = false;
		}
	}
}

/*
** 筛选法二:
** bool型数组里面只存奇数不存偶数。如定义prime[N],则0表示3,1表示5,2表示7,3表示9...,
** 如果prime[0]为true,则表示3时素数。prime[3]为false意味着9是合数。
**
*/
void IsPrime4(int n, bool prime[])	// 在VS2010中运行时间为1秒
{
	int i, j;

	for (i = 0; 2 * i + 3 <= sqrt(1.0 * n); i += 1)
	{   
		if(prime[i])
		{
			for (j = i + 2 * i + 3; j <= n / 2; j += 2 * i + 3) 
				prime[j] = false;
		}
	}
}

素数定理:

1~n范围内的素数个数极限为n/ln(n);

点赞