判断素数的多种方法

浙大c语言设计第八章8.2第二个视频

方法一:从2到x-1测试是否可以整除

int isPrime(int x)

{

    int ret = 1;

    int i;

    if(x == 1) ret = 0;//处理 1不是素数 的问题

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

    {

        if(x%i == 0){

            ret = 0;

            break;

        }

    }

    return ret;

}

对于n压迫循环n-1遍,当n很大时要循环n遍

方法二:去掉偶数后,从3到x-1,每次加2

int isPrime(int x)

{

    int ret = 1;

    int i;

    if(x == 1 || (i%2==0 && i!=2)) ret = 0;//处理 1不是素数 的问题, 偶数不算素数

    for(i=3; i<x; i+=2)

    {

        if(x%i == 0){

            ret = 0;

            break;

        }

    }

    return ret;

}

如果x时偶数,立刻判断出来,否则要循环(n-3)/2 +1遍,当n很大时就是n/2遍

方法三:改进方法二,不需要走动x-1,只需要走到sqrt(x)就行了,需要在头文件加math.h

int isPrime(int x)

{

    int ret = 1;

    int i;

    if(x == 1 || (i%2==0 && i!=2)) ret = 0;//处理 1不是素数 的问题, 偶数不算素数

    for(i=3; i<sqrt(x); i+=2)

    {

        if(x%i == 0){

            ret = 0;

            break;

        }

    }

    return ret;

}

只需要走sqrt(x)遍就可以了。

方法四:判断能否被已知的且小于x的素数整除,前提是需要先有一张已有的素数表

适用场景:构造素数表

#include <stdio.h>

int isPrime(int x, int KnownPrimes[], int numberOfKnownPrimes);

int main(int argc, const char * argv[]) {

    // insert code here..

    const int number = 100;

    int prime[number] = {2};//初始素数表中只有2

    int count = 1;//记录素数表内元素个数

    int i=3;

    

    //构造素数表

    while (count < number) {

        if( isPrime(i,prime,count)){

            prime[count++] = i;

        }

        i++;

    }

    

    //打印素数表 5个一行

    for( i= 0; i< number; i++){

        printf("%d", prime[i]);

        if((i+1)%5) printf("\t");

        else printf("\n");

    }

    return 0;

}

int isPrime(int x, int KnownPrimes[], int numberOfKnownPrimes)//传入要检测的数x,已知的素数表,已知素数表的个数

{

    int ret = 1;

    int i;

    for( i=0; i<numberOfKnownPrimes; i++ )

    {

        if( x % KnownPrimes[i] == 0){

            ret = 0;

            break;

        }

    }

    return ret;

}

构造素数表

欲构造n以内的素数表 算法描述

1、令x=2;

2、将2x、3x、4x以及ax标记为非素数;

3、令x为下一个没有被标为的非素数的数,重复2,知道所有的数都已尝试完毕;

欲构造n以内(不含)的素数表 伪代码描述

1、开辟prime[n],初始化所有元素为1,prime[x]为1表示x是素数;

2、令x=2;

3、如果x是素数,对于(i=2;x*i<n; i++)令prime[x*i] ==0;

4、令n++,如果x<n,重复步骤3,否则结束。

#include <stdio.h>

int main(int argc, const char * argv[]) {

    // insert code here...

    const int maxNumber = 25;

    int isPrime[maxNumber];

    int x;

    int i;

    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\t", i);

        }

    }

    

    printf("\n");

    return 0;

}

猜你喜欢

转载自blog.csdn.net/ilovejujube/article/details/107442636