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 2023年5月23日
    00
  • php实现可用于mysql,mssql,pg数据库操作类

    下面是实现可用于多种数据库操作的 PHP 类的完整攻略,主要分为以下几个步骤: 步骤一:创建基础类 首先,我们需要创建一个基础的数据库操作类,该类可用于多种数据库的操作。以下是一个简单的示例代码,其中假设所有的配置都存在类的属性中: class DB { private $host; private $username; private $password;…

    C 2023年5月23日
    00
  • 一次因信号量引发的tomcat异常退出解决

    下面是一次因信号量引发的Tomcat异常退出解决的完整攻略: 背景 在使用Tomcat时,有时候可能会因为进程无法获取到信号量而导致Tomcat异常退出。这种问题通常会在并发量较大的情况下出现。 解决方法 解决这种问题的方法是通过增加操作系统的信号量来提高并发量。下面是具体的操作步骤: 查看当前信号量的情况: ipcs -ls 在这个命令中,参数 -l 表示…

    C 2023年5月22日
    00
  • C语言程序栈

    C语言程序栈的使用攻略 概述 C语言程序栈是程序运行时自动分配和管理的一段内存空间,主要用于存储程序的局部变量、函数参数和一些临时数据等。根据先进后出的原则,程序栈提供了一种方便的内存分配和回收机制,可以有效地避免内存泄漏等问题。 栈的数据结构和操作原理 C语言程序栈是一种基于数组的数据结构,通常使用栈指针来表示当前栈顶的位置。栈的操作原理主要包括两个关键步…

    C 2023年5月9日
    00
  • C语言基于回溯算法解决八皇后问题的方法

    C语言基于回溯算法解决八皇后问题的方法 什么是八皇后问题? 八皇后问题是一个经典的、古老的问题,它的目标是在一个8×8的棋盘上放置8个皇后,使得每个皇后都无法互相攻击,即两个皇后不能在同一行、同一列或同一对角线上。 回溯算法解决八皇后问题 回溯算法(Backtracking Algorithm),又称试探法,是一种系统地搜索问题的解的算法。它的基本思想是从问…

    C 2023年5月22日
    00
  • C语言实现猜数字小游戏的示例代码

    下面是“C语言实现猜数字小游戏的示例代码”的完整攻略。 小游戏介绍 猜数字小游戏是一款非常简单而有趣的小游戏,游戏规则如下: 计算机随机生成一个0到100的数字,你需要通过键盘输入一个数字作为你的猜测; 如果你的猜测数字与计算机随机生成的数字一致,则恭喜你猜对了,游戏胜利; 如果你的猜测数字大于计算机随机生成的数字,则计算机会告诉你猜的数字比实际数字大; 如…

    C 2023年5月24日
    00
  • C语言初学者代码中的常见错误与问题

    C语言初学者代码中的常见错误与问题攻略 作为一名C语言初学者,在编写代码的过程中可能会遇到一些常见的错误与问题,这些错误可能会造成程序的崩溃或者输出结果不正确。因此,本攻略将对C语言初学者常见的错误进行讲解,并提供一些解决方案。 1. 未声明变量 在C语言中,如果使用一个未声明的变量,编译器就无法确定该变量的类型和大小,从而导致编译错误。为避免这种错误,需要…

    C 2023年5月24日
    00
  • Linux中find命令的用法入门

    下面是“Linux中find命令的用法入门”的完整攻略: 一、find命令的简介 在Linux系统中,find命令通常用于查找文件或目录。该命令很强大,可以根据不同的条件进行文件或目录的查找,并支持多种操作。 二、find命令的基本用法 基本语法:find [path] [options] [expression] path:要查找的路径。 options:…

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