background image

 

}
 

3:这个方法是上面方法的改进,但要求 N 平方根以下的素数已全部知道

算法 2:遍历 2 以上 N 的平方根以下的每一个素数,是不是能整除 N;

(这个方法是上面方法的改进,但要求 N 平方根以下的素数已全部知道)
void PrimeNumber2()

{
int time GetTickCount();

cout start time time endl;
 

int Max[MAX_NUMBER2]; 在栈上分配,栈上空间要求一般都在 2M 之间,

如果你需要更大空间,请在堆上申请空间(就是通过 malloc,new 来申请).素数的个数

很少
所以没有必要申请和所求数字同样大小的空间。
memset(Max,0,MAX_NUMBER);
Max[0] = 2; 放入第一个素数,有人说 2 不是素数,如果你是其中一员,就改成 3 吧

int cout = 1; 记录素数个数
 

挨个数进行验证
bool bflag = true;

for(int i = 3; i MAX_NUMBER; ++i)
{

bflag = true;

需要是使用数学库(math.h)中 sqrt

int iTemp = (int)sqrt((float)i); 强制转换成 int 类型,有的人在这里使用 i+1 就是为了

增加 sqrt 的精度

没有特殊函数,你也可以使用 int iTemp = (int)sqrt(i)+1;来提高进度
 

修改的是这里以下的部分
for (int j = 0; j cout; ++j)

{
if(i%Max[j] == 0) 求余,如果为 0 说明,可以整除,不是素数。

{
bflag = false;

break;
}

}

修改的是这里以上的部分
 

经过验证是素数,放入数组。
if(bflag)
{

Max[cout++] = i;
}

}
 

int time GetTickCount();
cout end time time endl;

 
}

 
4:采用 Rabin-Miller 算法进行验算,Rabin-Miller 算法是典型的验证一个数字是否为

素数的方法。判断素数的方法是 Rabin-Miller 概率测试,那么他具体的流程是什么呢。

假设我们要判断 n 是不是素数,首先我们必须保证 n 是个奇数,那么我们就可以把 n 表

 

示为 n = (2^r)s+1,注意 s 也必须是一个奇数。然后我们就要选择一个随机的整数 a