ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【C语言】求质数(素数)的三种方法

2022-07-20 21:33:52  阅读:349  来源: 互联网

标签:prime no int 质数 C语言 ++ 素数 ptr


 

C语言中求质数的三种方法:

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

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

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

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

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

 

1.试除法:计算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;
}

 

 

2.排除偶数法:计算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;
}

 

 

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

#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;
}

 

4.在奇数里面,判断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;
}

5.

#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;
}

 

标签:prime,no,int,质数,C语言,++,素数,ptr
来源: https://www.cnblogs.com/sdr900/p/16499930.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有