打卡第九天(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]);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值