首先需要讲的是这篇文章,太精辟了:
http://www.cnblogs.com/luluping/archive/2010/03/03/1677552.html
1.最简单的求素数:
bool isPrime(int primes[], int n)
{
if(n < 2) return false;
for(int i = 0; primes[i]*primes[i] <= n; ++i)//循环过程的处理,优化了很多哦
if(n%primes[i] == 0) return false;
return true;
}
2.得到一个素数表:
// 构造素数序列primes[]
void makePrimes(int primes[], int num)
{
int i, j, cnt;
primes[0] = 2;
primes[1] = 3;
for(i = 5, cnt = 2; cnt < num; i += 2)
{
int flag = true;
for(j = 1; primes[j]*primes[j] <= i; ++j)
{
if(i%primes[j] == 0)
{
flag = false; break;
}
}
if(flag) primes[cnt++] = i;
}
}
如上是得到一个纯素数表,而使用筛选法可以得到一个范围内的素数表:
#include<stdio.h>
int main()
{
int x[100001];
int tmp,n,i;
for(i=0;i<100001;i++) x[i]=0;//质数为0
x[0]=x[1]=1;
for(i=2;i<50000;i++)
{
if(x[i]==0) tmp=2*i;
while(tmo<=100000)
{
x[tmp]=1; tmp +=i;
}
}
return 0;
}
3.有了纯素数表之后,就可以进行二分查找了
// 测试n是否是素数
bool Prime_test(int n)
{
assert(n > 0);
if(n < 2) return false;
if(n == 2) return true;
if(!(n&1)) return false;
// 如果n为素数, 则在序列hi位置之前
int lo, hi = (int)ceil(n/(log(n)-3/2.0));
if(hi < NELEMS(primes))
{
// 确定2分法查找的范围
// 只有n >= 67是才满足素数定理
if(n >= 67) lo = (int)floor(n/(log(n)-1/2.0));
else { lo = 0; hi = 19; }
// 查找成功则为素数
return NULL !=
bsearch(&n, primes+lo, hi-lo, sizeof(n), cmp);
}
else
{
// 不在保存的素数序列范围之内的情况
for(int i = 1; primes[i]*primes[i] <= n; ++i)
if(n%primes[i] == 0) return false;
return true;
}
}