法一:
求质数的方法最简单的就是这样:
写道
判断N是否是质数
从2到根号下N 以此判断是否能整除
从2到根号下N 以此判断是否能整除
int isprim(long int n)
{
for(int i = 2; i <=sqrt(N); i++)
if(n % i == 0) return 0;
return 1;
}
要依次产生前多少项质数 我们可以这样:
void get1(long int s[], int N)
{
int i;
long int n;
s[1] = 2;
for(i = 2; i < N; i++){
n = s[i-1] + 1; // the latest number
while(!isprime(n)) n++;
s[i] = n;
}
}
法二:筛选法
从第3个数开始,以此用当前产生的所有素数来排除下一个要产生的素数:
比如 写道
已有1,2,3,5
则下个数从6开始,并排除能整除2,3,5的数 即6,8,9,10....
则下个数从6开始,并排除能整除2,3,5的数 即6,8,9,10....
实现算法:
/* 筛选法 */
void get2(long int s[], int N)
{
int cur, i;
long int n;
s[1] = 2;
cur = 2;
while(cur < N){ // find the num'th
n = s[cur-1] + 1; // or bigger one to begin searching
while(1){
for(i = 1; i < cur; i ++)
if(n % s[i] == 0) // not match
break;
if(i == cur) { // match
s[cur] = n;
break;
} else
n++; //next trying
}
cur++; //next number
}
}
两者比较:
产生前10万个素数:
法一:150s
法二:25s