质数的筛法--Eratosthenes筛法
题目来源于C和指针的编程练习。筛选出 2~某个上限数字之间的质数。
假设有数组num[100],num[0] = 2, num[1] = 3 ,依次类推。
先筛出能被2整除的数字,然后再次遍历数组筛出能被3整除的,接着是4,但是4已经被筛除,所以跳过,如此往复。
(后面还附上了一个普通的查询质数的代码)
题目要求将所有数组元素设置为TRUE(1),非质数则将其重新赋值为FALSE。
因此我利用了数组下标作为计算的主题,然后查看该下标是否是质数,再通过对下标进行简单的运算,确定此次运算归属于哪个数组元素。
如果想要得知50000~51000,之间有多少个素数,可以通过修改SIZE ,在最后一段检测打印的部分,添加条件,I+2 > 50000 && i+2 < 51000,来获取当前区间的质数。
问题是,中间将面临很多的无用运算。
以下是代码,请指正
# include <stdio.h> # define SIZE 100 # define TRUE 1 # define FALSE 0 int main() { int num[100]; int* pt = &num[0]; for (int i = 0; i < SIZE; i++) num[i] = TRUE; int base = 2; while ( pt<&num[SIZE]) //别写成 pt!=NULL .... 报错时就已经知道应该是数组越界的问题了,但是这个语句有点顺眼.... { if (*pt) //检查当前元素是否已被筛除 { for (int i = base; i < SIZE; i++) { if (!num[i - 1]) //同理,在进行筛选的过程中,跳过已被筛除的对象 continue; if ((i + 1) % base == 0) num[i-1] = FALSE; } } base++; pt++; }
int count = 0; // 统计质数的个数 for (int i = 0; i < SIZE; i++) //打印数组元素中为TRUE的元素的下标,检查是否为质数。 if (num[i] == TRUE) {
printf("%d ", i+2);
count++;
} printf("\n 有%d 个素数\n",count); return 0; }
下面附上一个普通的质数找寻代码,主要通过确定被整除的次数,而缩短计算过程
2.打印1~100的所有质数 # include <stdio.h> int main() { int confirmed = 0 ; //已被验证是质数的数字的个数,方便换行打印,看起来工整些 for(int num = 1; num <= 100; num++) { int count = 0; //被整除的次数 for(int i = 1;i<=num;i++) { if(num % i == 0) count++; } if(count < 3) { confirmed++ ; printf("%d ",num); if(confirmed % 5 == 0) putchar('\n'); } }
return 0; }
浙公网安备 33010602011771号