求素数的几个方法

#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);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值