c语言筛法求素数原理,【C语言】筛法求素数以及其他

《algorithm:c》在第一节就介绍了求素数的方法,书中只涉及了筛法求素数,实际而言,还有其他一些方法,相比筛法,虽然效率不高,但也是很巧妙的,从这些方法的对比中,可发见一种思维的乐趣。具体地思路介绍,请看:http://program-think.blogspot.com/2011/12/prime-algorithm-1.html

代码请看:

#include

#include

#define N 3000

int isPrim(int n);

int isPrimBasic(int n);

int isPrimSqrt(int n);

void setOne(int c[], int bitpos);

#if 1 // 筛选求素数

int main()

{

int i, j, a[N+1];

int c[N/2+1];

int b;

int temp = 0x01;

for(c[1] = 0, i = 2; i <= N/2; i++)

c[i] = 0;

for(a[1] = 0, i = 2; i <= N; i++)

a[i] = 1;

for(i = 2; i <= N/2; i++)

for(j = 2; j <= N/i; j++)

a[i*j] = 0;

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

if(a[i])

printf("%6d", i);

printf("\n");

/* 按位存储素数,没做出来

for(i = 2; i <= N/4; i++)

for(j = 2; j <= (N/2)/i; j++)

setOne(c, i*j);

for(i = 1; i <= N/2; i++)

{

for(j = 0; j < sizeof(int)*8; j++)

{

temp = 0x01;

temp = temp << j;

if( !(c[i] & temp ) )

printf("%d\n", i*sizeof(int)*8+j);

}

}

*/

printf("\n");

while(scanf("%d", &b) != EOF)

{

if(isPrim(b))

printf("素数\t%d\n", b);

if(isPrimSqrt(b))

printf("素数 sqrt\t%d\n", b);

}

return 0;

}

#endif

void setOne(int c[], int bitpos)

{

int i = 0x01;

i = i << bitpos%(sizeof(int)*8);

c[bitpos/(sizeof(int)*8)] = c[bitpos/(sizeof(int)*8)] | i;

}

int isPrim(int n)

{

int i;

if( 1 == n || 2 == n)

return 1;

if( n%2 == 0)

return 0;

for(i=3; i < n/2; i+=2)

if(n%i == 0)

return 0;

return 1;

}

int isPrimSqrt(int n)

{

int i;

if( 1 == n || 2 == n)

return 1;

if( n%2 == 0)

return 0;

for(i = 3; i <= (int)sqrt((double)n); i+= 2)

if(n%i == 0)

return 0;

return 1;

}

int isPrimBasic(int n)

{

int i;

for(i = 2; i < n; i++)

if(n%i == 0)

return i;

return 1;

}

本来想实现按位存储素数的方法,但是失败了,又有其他的事情要忙 ,所以先挖坑,留待下次来解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值