用筛选法求质数的一个小程序

microzhao 2004-09-11 04:56:53
我碰到一个用筛选法求质数的题,程序如下:
#include <stdio.h>
#define N 50
#define LN 16

main()
{
unsigned int sieve[N],primes[N];
unsigned int j,w,p,c;
for(j=0;j<N;j++)
{
sieve[j]=0xFFFF;//筛子
primes[j]=0x00;//质数表
}
w=0;
j=0;
do{
while(((0x01<<j++))&&sieve[w]==0x00);
p=w*LN+j-1;
c=2*(p+1)+1;
primes[w]|=0x01<<(j-1);
do
{
sieve[p/LN]&=(~(0x01<<p%LN));//p%LN位置0
p+=c;
}while(p<N*LN-LN);
while((sieve[w]==0x00)&&(w<N-1))
{
w++;
j=0;
}

}while(sieve[w]);
printf("%5d",2);
for(w=0;w<N;w++){
for(j=0;j<LN;j++)
if((0x01<<j)&&primes[w])
printf("%10d",2*(w*LN+j+1)+1);
}
printf("\n");
}
可是结果不对,显示的是奇数,我看了半天也不知道怎么改,哪位帮忙调试调试,谢谢了
...全文
179 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
microzhao 2004-09-11
  • 打赏
  • 举报
回复
非常感谢
shw014 2004-09-11
  • 打赏
  • 举报
回复
....
while(((0x01<<j++)&sieve[w])==0x00);
应该用按位与& ,&优先级低与==
....
while(p<N*LN);
你最后一个sieve[49]漏了
....
if((0x01<<j)&primes[w])
应该用按位与&

shw014 2004-09-11
  • 打赏
  • 举报
回复
#include <stdio.h>
#define N 50
#define LN 16

main()
{
unsigned int sieve[N],primes[N];
unsigned int j,w,p,c;
for(j=0;j<N;j++)
{
sieve[j]=0xFFFF;//筛子
primes[j]=0x00;//质数表
}
w=0;
j=0;
do{
while(((0x01<<j++)&sieve[w])==0x00);
// ^^ ^
p=w*LN+j-1;
c=2*(p+1)+1;
primes[w]|=0x01<<(j-1);
do
{
sieve[p/LN]&=(~(0x01<<p%LN));//p%LN位置0
p+=c;
}while(p<N*LN);
// ^^^^
while((sieve[w]==0x00)&&(w<N-1))
{
w++;
j=0;
}

}while(sieve[w]);
printf("%5d",2);
for(w=0;w<N;w++){
for(j=0;j<LN;j++)
if((0x01<<j)&primes[w])
// ^^
printf("%10d",2*(w*LN+j+1)+1);
}
printf("\n");
}

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧