C语言求质数(素数)的方法解析

C语言中求质数的方法

试除法,根据质数的定义,对每个数字no进行(2~no-1)的试除

排除偶数法,2的倍数(除2之外),都不是质数

排除偶数法的基础上,对奇数进行奇数的试除

在奇数里面,判断no能否被 小于no的质数 整除

使用math函数的sqrt,试除法的改进,对数字进行(2~sqrt(no))的试除

试除法:计算1~1000以内的质数

方法1:常规遍历
#include <stdio.h>
int main() {
    int i, no;
    unsigned long counter = 0;


    for (no = 2; no <= 1000; no++) {
        for (i = 2; i < no; i++) {
            counter++;
            if (no % i == 0)
                break;
        }
        //如果最终的i==no,说明一定是质数
        if (no == i)
            printf("%d\n", no);
    }

    printf("乘除运算的次数:%lu\n", counter);
    return 0;
}

排除偶数法:计算1~1000以内的质数

#include <stdio.h>
int main() {
    int i, no;
    unsigned long counter = 0;
    
    //单独打印no=2
    no = 2;
    printf("%d\n", no++);

    //此时for循环中,no=3开始,步长调整为2
    //过滤掉除2之外的偶数,它们都不是质数
    for (; no < 1000; no += 2) {
        for (i = 2; i < no; i++) {
            counter++;
            if (no % i == 0)
                break;
        }
        if (no == i)
            printf("%d\n", no);
    }
    printf("乘除运算的次数:%lu\n", counter);
    return 0;
}

排除偶数法的基础上,对奇数进行奇数的试除

#include <stdio.h>
int main() {
    int i, no;
    unsigned long counter = 0;

    no = 2;
    printf("%d\n", no++);
    
    //从no=3开始,步长为2
    for (; no <= 1000; no += 2) {
        //在奇数里面使用奇数进行试除
        for (i = 3; i < no; i += 2) {
            counter++;
            if (no % i == 0)
                break;
        }
        if (no == i)
            printf("%d\n", no);
    }
    printf("乘除运算的次数:%lu\n", counter);
    return 0;
}

在奇数里面,判断no能否被 小于no的质数 整除

#include <stdio.h>
int main() {
    int i, no;
    int prime[500];//先排除掉偶数
    int ptr = 0;
    unsigned long counter = 0;

    //prime[0]=2,prime[1]=3,ptr=2
    prime[ptr++] = 2;
    prime[ptr++] = 3;

    //no=5,对奇数进行遍历,
    for (no = 5; no <= 1000; no += 2) {
        //判断能否被小于no的质数整除
        for (i = 1; i < ptr; i++) {
            counter++;
            if (no % prime[i] == 0)
                break;
        }
        if (ptr == i)
            prime[ptr++] = no;
    }
    for (i = 0; i < ptr; i++)
        printf("%d\n", prime[i]);
    printf("乘除运算的次数:%lu\n", counter);
    return 0;
}

使用math函数的sqrt,试除法的改进,对数字进行(2~sqrt(no))的试除

#include <stdio.h>
int main() {
    int i, no;
    int prime[500];
    int ptr = 0;
    unsigned long counter = 0;

    prime[ptr++] = 2;
    prime[ptr++] = 3;

    for (no = 5; no <= 1000; no += 2) {
        int flag = 0;
        for (i = 1; counter++, prime[i]*prime[i] <= no; i++) {
            counter++;
            if (no % prime[i] == 0) {
                flag = 1;
                break;
            }

        }
        if (!flag)
            prime[ptr++] = no;
    }
    for (i = 0; i < ptr; i++)
        printf("%d\n", prime[i]);
    printf("乘除运算的次数:%lu\n", counter);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_55305220/article/details/130830917