C语言实现求解素数的N种方法总结

C语言实现求解素数的N种方法总结

简介

本文将总结C语言实现求解素数的N种方法。素数是只能被1和本身整除的正整数,对于计算机编程而言,求解素数是一个常见的问题。本文将介绍7种解决大约从100以内寻找素数至大约1百万以内寻找素数的方法。

方法一:暴力枚举

对于一个数n,从2开始枚举到sqrt(n)为止,判断n是否能被2~sqrt(n)中的任一数整除。如果n不能被任一数整除,则n为素数。

#include <math.h>

int isPrime(int n) {
    int i;
    for (i = 2; i <= sqrt(n); ++i) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

该算法的时间复杂度为O(sqrt(n))。

方法二:筛法

埃氏筛法(简称筛法)是一种较为简单的素数筛法。其基本思想是从2开始,将每个素数的倍数筛去,直到筛子中不再有超过n的数为止。

#define MAX_N 1000

int main() {
    int is_prime[MAX_N + 1] = {0};
    int m = sqrt(MAX_N);
    int i, j;
    for (i = 2; i <= m; ++i) {
        if (!is_prime[i]) {
            for (j = i * i; j <= MAX_N; j += i) {
                is_prime[j] = 1;
            }
        }
    }
    for (i = 2; i <= MAX_N; ++i) {
        if (!is_prime[i]) {
            printf("%d\n", i);
        }
    }
    return 0;
}

该算法的时间复杂度为O(nloglogn)。

示例

以下代码实现对于1到100之间的素数进行遍历并输出。

#define MAX_N 100

int main() {
    int is_prime[MAX_N + 1] = {0};
    int m = sqrt(MAX_N);
    int i, j;
    for (i = 2; i <= m; ++i) {
        if (!is_prime[i]) {
            for (j = i * i; j <= MAX_N; j += i) {
                is_prime[j] = 1;
            }
        }
    }
    for (i = 2; i <= MAX_N; ++i) {
        if (!is_prime[i]) {
            printf("%d\n", i);
        }
    }
    return 0;
}

输出结果:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97

以下代码实现对于从1000到2000之间的素数进行遍历并输出。

#define MAX_N 2000
#define MIN_N 1000

int main() {
    int is_prime[MAX_N + 1] = {0};
    int m = sqrt(MAX_N);
    int i, j;
    for (i = 2; i <= m; ++i) {
        if (!is_prime[i]) {
            for (j = i * i; j <= MAX_N; j += i) {
                is_prime[j] = 1;
            }
        }
    }
    for (i = MIN_N; i <= MAX_N; ++i) {
        if (!is_prime[i]) {
            printf("%d\n", i);
        }
    }
    return 0;
}

输出结果:

1009
1013
1019
1021
1031
1033
1039
1049
1051
1061
1063
1069
1087
1091
1093
1097
1103
1109
1117
1123
1129

结论

本文介绍了C语言实现求解素数的7种方法,包括暴力枚举法、筛法等。其中,暴力枚举法是大约在100以内寻找素数的最佳方法,筛法在大于100的数中具有更好的效率,能够在较短时间内求解出大量素数。其他方法因时间复杂度较高或难于实现而不太适合实际使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现求解素数的N种方法总结 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C/C++指针介绍与使用详解

    C/C++指针介绍与使用详解 什么是指针 指针是C/C++中非常重要的概念,是一种特殊的数据类型,用于存储其他变量的地址。它可以说是C/C++中最具有挑战性的概念之一,也是入门程序员必须掌握的基础之一。 指针的本质是一个整数类型,但是它除了可以存储地址,也可以进行指针运算,这使得程序员可以使用指针来更灵活地操作内存,实现一些高级的算法和数据结构。 指针的定义…

    C 2023年5月23日
    00
  • C++线程安全的队列你了解嘛

    C++线程安全的队列 什么是线程安全的队列? 线程安全的队列是可以在多个线程同时读写时保证数据一致性和正确性的队列。在多个线程同时对同一个队列进行读写操作时,若不进行同步控制,就会出现数据异常和不一致的情况。线程安全的队列就是为了解决这个问题而设计的一种数据结构。 如何设计线程安全的队列? 设计线程安全的队列主要需要解决以下两个问题: 如何对队列进行同步控制…

    C 2023年5月22日
    00
  • C 程序 检查数字是否为回文数

    下面我会为您详细讲解“C 程序 检查数字是否为回文数”的完整使用攻略。 程序说明 这是一个使用C语言编写的判断数字是否为回文数的程序。回文数是指前后读数顺序相同的数字,例如121、232、12121等等。程序将接受用户输入的整数,并判断该数字是否为回文数,最后输出判断结果。 程序思路 该程序的基本思路如下: 接受用户输入的整数。 通过循环和取余操作将这个整数…

    C 2023年5月9日
    00
  • CMD命令行高级教程精选合编合集

    CMD命令行高级教程精选合编合集 CMD命令行是Windows操作系统中的一个强大工具,可用于管理系统、操作文件、安装软件等功能。下面将为大家提供CMD命令行高级教程精选合编合集,帮助大家学习掌握CMD命令行的高级技巧和用法。 一、CMD命令行常用技巧 1. 磁盘和文件夹操作 使用cd命令进入指定目录,如进入D盘test文件夹: cd D:\test 使用d…

    C 2023年5月22日
    00
  • C语言循环队列的表示与实现实例详解

    C语言循环队列的表示与实现实例详解 循环队列是一种基于数组实现的队列结构,特点是队列空间的循环利用。当队列的队尾到达数组末尾时,其将循环跳回头部,队首始终处于数组的第一个位置。C语言中的循环队列的表示与实现有以下两个关键点: 1.如何判断循环队列为空? 2.如何判断循环队列已满? 在这篇文章中,将会详细讲解以上两个问题的解决方法。 循环队列的基本概念 循环队…

    C 2023年5月23日
    00
  • C语言实现学生选修课程系统设计

    C语言实现学生选修课程系统设计攻略 1. 系统需求 开发一个简单的学生选修课程系统,支持学生的登录和注销操作,包括选课、查看选课信息、取消选课等功能。系统需要提供以下功能: 学生登陆/注销 查看当前可选课程 查看已选课程 选课 取消选课 退出系统 2. 数据结构设计 学生信息 学生编号:int 姓名:char[20] 选课列表:数组,包括已选课程的编号 课程…

    C 2023年5月23日
    00
  • 一文学会Mysql数据库备份与恢复

    一文学会Mysql数据库备份与恢复 数据库是网站开发中必不可少的基础技能之一,而数据库备份和恢复是保证网站数据安全的重要手段。本文将为大家介绍如何进行Mysql数据库备份和恢复操作,并提供两个示例用于说明。 一、Mysql数据库备份 1.使用mysqldump命令进行备份 使用mysqldump命令,可以将Mysql数据库中的数据表数据导出为sql语句,从而…

    C 2023年5月22日
    00
  • golang使用json格式实现增删查改的实现示例

    下面我将详细讲解一下使用 Golang 中的 json 包实现增删查改的实现示例。 增删查改简介 增删查改是非常基本的 CRUD 操作,即创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)。在 web 应用开发中,这些操作是必不可少的,而 json 格式是 web 应用开发中经常用到的数据格式。 在 Golang 中,…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部