打卡第九天(Trial division)

Trial division

试除法求最小N个素数是一个经典的算法。

可以使用素数分类的性质来加快计算的速度。

除了2以外,素数只能是2n+1,n>=1。

除了2、3和5以外,素数只能是6n+1或6n+5,n>=1

/*

* 试除法计算最小的N个素数

*

* 素数中除了2以外,均为奇数。

* 可以用试除法从奇数中挑选出最小的N个素数。

*

* 另外,<span style="color: rgb(0, 128, 0);">除了2、3和5之外,</span>素数只可能是6n+1或6n+5,n>=1。

* 所有有另外一种计算方法,会稍微快一些。

*/

#include <stdio.h>

#include <math.h>

#define N 25

int prime[N] = {2, 3, 5};

void output_result(void);

void primes()

{

int n = 3;

int i = 2;

for(;;) {

n += 2;

int j, q =sqrt(n);

for(j=1; prime[j]<=q; j++)

if(n % prime[j] == 0)

break;

if(prime[j] > q)

prime[i++] = n;

if(i == N)

break;

}

}

void primes2()

{

int n1=1, n2 = 5;

int i = 3;

for(;;) {

n1 += 6;

int j, q =sqrt(n1);

for(j=1; prime[j]<=q; j++)

if(n1 % prime[j] == 0)

break;

if(prime[j] > q)

prime[i++] = n1;

if(i == N)

break;

n2 += 6;

q =sqrt(n2);

for(j=1; prime[j]<=q; j++)

if(n2 % prime[j] == 0)

break;

if(prime[j] > q)

prime[i++] = n2;

if(i == N)

break;

}

}

int main(void)

{

primes();

output_result();

primes2();

output_result();

return 0;

}

void output_result()

{

int i;

for(i=0; i<N; i++)

printf("%d:%d\n", i+1, prime[i]);

}

猜你喜欢

转载自blog.csdn.net/huangluping12345/article/details/82918484