![](/img/trans.png)
[英]Why is this check for prime numbers returning true on some non-prime numbers?
[英]Why is my program giving me all the non-prime numbers when I ask for prime numbers?
我想使用位数组和Eratosthenes算法的筛子来查找一定范围内的所有素数。 我的代码可以编译,但是会打印所有非素数而不是素数(2除外,因为我要求我的Sieve函数打印2)。 有人可以查看我的代码并给我一些有关如何解决它的提示吗? 非常感谢您的帮助。 谢谢!
注意:我的家庭作业的要求是使用位数组。
#include <stdio.h>
#include <stdlib.h>
//#define MAXBYTES 1000000
#define MAXBYTES 10
void setBit(unsigned int A[], int k);
unsigned getBit(unsigned int A[], int k);
void print_prime (int prime_num);
void sieve_Prime(unsigned int bit_arr[]);
int main (int argc, char** argv)
{
//int bit_arr[MAXBYTES]; //This is the bit array (32 X MAXBYTES)
unsigned int bit_arr[MAXBYTES]; //or bit_arr[MAXBYTES]
int i;
for (i=0; i < MAXBYTES; i++)
{
bit_arr[i] = 0x00; //initialize all bits to 0s
}
setBit(bit_arr, 0); //0 is not prime, set it to be 1
setBit(bit_arr, 1); //1 is not prime, set it to be 1
sieve_Prime(bit_arr);
printf("\n");
return 0;
}
//Set the bit at the k-th position to 1
void setBit(unsigned int A[], int k)
{
int i = k/32;
int pos = k % 32;
unsigned int flag = 1; //flag = 0000 ..... 00001
flag = flag << pos; //flag = 0000...010...000 (shifted k positions)
A[i] = A[i] | flag; //Set the bit at the k-th position in A[i];
}
//get the bit at the k-th position
unsigned getBit(unsigned int A[], int k)
{
int i =k/32;
int pos = k % 32;
unsigned int flag = 1;
flag = flag << pos;
if (A[i] & flag)
return 1;
else
return 0;
}
void print_prime (int prime_num)
{
//print a prime number in next of 8 columns
static int numfound=0;
if (numfound % 8 == 0)
printf("\n");
if (prime_num+1 < MAXBYTES*8)
printf("%d\t", prime_num);
numfound++;
}
void sieve_Prime(unsigned int bit_arr[])
{
int i;
int k;
int next_prime = 2;
print_prime(2);
while (next_prime+1 < MAXBYTES*8)
{
k = next_prime;
//multiples of next_prime is not primpe
while(next_prime*k < MAXBYTES*8)
{
setBit(bit_arr, next_prime*k); //set it to be 1
k++;
}
//find next_prime by skipping non-prime bits marked 1
while (next_prime + 1 < MAXBYTES*8 && getBit(bit_arr, ++next_prime))
{
print_prime(next_prime);
}
}
}
问题是您的循环:
while (next_prime + 1 < MAXBYTES*8 && getBit(bit_arr, ++next_prime))
{
print_prime(next_prime);
}
在设置位 (即您知道它不是素数)的同时继续打印东西。 因此,基本上,您的循环是“打印我在寻找下一个质数时发现的所有数字”,而不是“在循环中寻找下一个质数,然后打印下一个质数”。
我怀疑您想要类似的东西:
next_prime++; // We always want to at least move on once...
while (next_prime + 1 < MAXBYTES*8 && getBit(bit_arr, next_prime))
{
next_prime++;
}
print_prime(next_prime);
我还没有检查代码是否全部错误,但这当然是要解决的最初问题。
您只需添加下一个初始化构造即可使用零值初始化数组:
unsigned int bit_arr[MAXBYTES] = { };
然后,数组的每个成员将保持零值。 另外,请尽量避免使用诸如printf("\\n");
类的东西printf("\\n");
。 如果一次只需要输出一个符号,则最好使用putchar('\\n')
。
此外,如果不打算在此转换单元之外使用此例程,则可以将static
关键字添加到工作函数原型和定义( main
函数除外)中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.