结合第四种方法,这两种方法可以相互借鉴理解,都是围绕是不是能被自己算出的素数整除来判断,下一个数是不是素数.
其实不难理解,如果想要验证一个数能不能被整除,我们放开思路,那这个除数肯定比这个数小,那这个除数可以是素数,也可以不是素数,反正我们还要继续往下验证
例如, 16 我们要判断是不是素数, 他一看,2 ,直接排除,那我们就不用验证4 8了, 27呢? 一看3 9 ,如果验证了3,就不用验证9了, 49呢? 2 不行,3不行,4,5,6,不行,到7了,可以了.
我们会发现,这些不是素数的数, 至少有一个数是素数的倍数,49 是两个素数7 想乘,
所以我们没必要拿着 等于素数的倍数的数 来验证一个数是不是素数
直接那素数来验证就可以了,那你就可以理解第四种方法了
接下来我们提供第五种方法
就是给我们一串数字 2 到100
我们看从2开始,判断是不是素数, 当然2肯定是素数, 那就把是2的倍数的数字全部排除, 接下来验证3, 然后3的倍数排除, 4判断吗? 答案是不用,因为我们已经用2对他贴了标签了, 直接验证目前没有贴标签的就行了
我们这里用的技术就是利用数组地址 ,逐个累乘,贴标签
for(int i=0; i<maxNumber; i++){
isPrime[i] = 1;
}
for(int x=2; x<maxNumber; x++){
if( isPrime[x] ){
for( i=2; i*x<maxNumber; i++){
isPrime[i*x] = 0;
}
}
}
先初始化,然后是素数倍数的标记,接着便利没有贴标签的,就这样逐个排除
#include <stdio.h>
int main(int argc, char *argv[])
{
int nums;
printf("请输入,你要计算几以内的素数?\n");
scanf("%d",&nums);
const int maxNumber = nums;
int isPrime[maxNumber];
int i;
int x;
for( i=0; i<maxNumber; i++){
isPrime[i] = 1;
}
for( x=2; x<maxNumber; x++){
if( isPrime[x] ){
for( i=2; i*x<maxNumber; i++){
isPrime[i*x] = 0;
}
}
}
for ( i=2;i<maxNumber ;i++ )
{
if(isPrime[i]){
printf("%d\n",i);
}
}
printf("\n");
return 0;
}