C++如何判断一个数是不是素数

当然,作为一个网站的作者,我很乐意为你提供详细的攻略。

C++中判断一个数是否是素数,通常有两种方法:暴力枚举和筛法。

暴力枚举

暴力枚举是一种较为简单的方法,即对于一个数n,将n分别除以2,3,4,...,n-1,判断它是否能除尽这些数。若一旦出现n%i==0,则说明n不是素数。

暴力枚举的代码实现如下:

bool isPrime(int n) {
    if (n <= 1) return false;  // 排除小于等于1的数
    for (int i = 2; i <= n - 1; i++) {
        if (n % i == 0) return false;  // 如果 i 能够整除 n,则 n 不是素数
    }
    return true;
}

筛法

筛法则是一种更为高效的方法。常用的有埃氏筛法和线性筛法。

埃氏筛法

埃氏筛法的思路是,从2开始,将每个质数的倍数都标记成合数,以达到筛选素数的目的。其具体实现流程如下:

  1. 初始化一个bool类型的数组isPrime,长度为n+1,表示每个数的状态,初始值都为true
  2. 从2开始到$\sqrt{n}$,枚举所有质数p
  3. 对于当前质数p,枚举它的倍数i,从2开始,将isPrime[ip]标记为false,即ip不是素数
  4. 注意,为了避免重复标记,i从p开始枚举

埃氏筛法的实现如下:

vector<bool> isPrime(n+1, true);  // 初始化状态

for (int i = 2; i <= sqrt(n); i++) {
    if (isPrime[i]) {
        // 将质数的倍数标记成false
        for (int j = i*i; j <= n; j += i) {
            isPrime[j] = false;
        }
    }
}

// 统计素数的数量
int cnt = 0;
for (int i = 2; i <= n; i++) {
    if (isPrime[i]) cnt++;
}

return cnt;

线性筛法

线性筛法是埃氏筛法的升级版,它使用一个数组prime存储所有素数,并使用一个bool类型的数组isPrime表示每个数的状态,初始值都为true。具体实现流程如下:

  1. 初始化一个空的数组prime,表示所有质数; 初始化一个bool类型的数组isPrime,长度为n+1,表示每个数的状态,初始值都为true
  2. 从2开始到n,枚举所有数i
  3. 如果i是质数,将它添加到数组prime中;同时,将i的倍数标记为合数,并设置isPrime[i*p]=false
  4. 如果i不是质数,枚举prime数组中所有不超过i/p的素数p,如果i%p==0,则说明i不是素数,退出循环

线性筛法的实现如下:

vector<int> prime;  // 存储素数
vector<bool> isPrime(n+1, true);  // 初始化状态

for (int i = 2; i <= n; i++) {
    if (isPrime[i]) {
        prime.push_back(i);
    }
    for (int j = 0; j < prime.size() && i*prime[j] <= n; j++) {
        isPrime[i*prime[j]] = false;
        if (i % prime[j] == 0) {
            break;
        }
    }
}

// 统计素数的数量
int cnt = 0;
for (int i = 2; i <= n; i++) {
    if (isPrime[i]) cnt++;
}

return cnt;

至此,我们已经讲解了C++如何判断一个数是不是素数的完整攻略。其中,我们分别介绍了暴力枚举、埃氏筛法和线性筛法三种方法,其中埃氏筛法和线性筛法比暴力枚举更加高效,可以在处理大量数据时发挥更大的优势。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++如何判断一个数是不是素数 - Python技术站

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

相关文章

  • C语言如何实现可变参数详解

    下面我将详细讲解如何在C语言中实现可变参数。 可变参数的实现方式 在C语言中,可变参数的实现方式是使用stdarg.h头文件中的宏和函数。该头文件包含的是可变参数列表,一些宏和函数的定义,可以实现对参数的操作。 该头文件中常用的宏有: va_start:用于初始化可变参数列表,获取第一个可变参数值的地址。 va_arg:用于获取可变参数列表的下一个参数值。 …

    C 2023年5月23日
    00
  • C++基类指针和派生类指针之间的转换方法讲解

    C++基类指针和派生类指针之间的转换方法讲解 在C++多态编程中,我们经常需要将一个基类指针转换为派生类指针或将一个派生类指针转换为基类指针。这种指针之间的转换是很常见的操作,也十分重要,本文将详细介绍这种指针之间的转换方法。 基类指针转化为派生类指针 在C++中,基类指针转化为派生类指针有两种方法:静态转换和动态转换。 1. 静态转换 静态转换可以将基类指…

    C 2023年5月22日
    00
  • 基于条件变量的消息队列 说明介绍

    基于条件变量的消息队列是一种进程间通信机制,适用于多线程环境。在使用过程中,需要注意线程同步和互斥的问题。 什么是条件变量 条件变量是线程间同步的一种方式,线程可以调用它的wait()方法将自己阻塞,直到其他线程调用signal()方法才能重新运行。条件变量常和互斥锁配合使用,锁用来保护数据,条件变量用来等待特定条件的发生。 消息队列 消息队列是一种消息传递…

    C 2023年5月22日
    00
  • Visual Studio Code运行程序时输出中文成乱码问题及解决方法

    当在Visual Studio Code中运行程序时输出中文出现乱码问题,通常是由于命令行终端的默认字符集与程序输出字符集不一致导致的。下面就详细讲解解决此问题的步骤。 步骤一:查看当前终端默认字符集 运行以下命令查看当前终端默认字符集 chcp 下面是命令输出的结果: 活动代码页: 936 以上结果表示当前终端的默认字符集是“GB2312”。 步骤二:修改…

    C 2023年5月22日
    00
  • 联想小新Pro 13笔记本怎么样 联想小新Pro 13笔记本拆机+评测

    联想小新Pro 13 笔记本 联想小新Pro 13 笔记本是一款轻薄便携的高性能笔记本电脑,采用了第8代英特尔酷睿i5/i7处理器、全新独立显卡和全高清显示屏等最新的硬件配置,极大地提升了其性能和使用体验。同时,联想小新Pro 13 笔记本还拥有不错的外观设计和使用续航能力,深受广大用户的喜爱。 联想小新Pro 13 笔记本拆机 步骤1 – 拆卸电池 首先关…

    C 2023年5月22日
    00
  • 基于C语言的库封装发布技术详解

    基于C语言的库封装发布技术详解 什么是库封装? 库封装是指将一组相关联的函数、结构体、宏等封装起来,以形成一个独立且可重用的库文件的技术。库封装可以隐藏底层实现细节,提供简单、易用、安全、可靠的接口给上层应用程序使用,同时提供了灵活的维护性。 为什么需要库封装? 隐藏底层细节,只暴露公共接口,提供易用的API。 提高代码的可重用性,不用在每一个项目中重新编写…

    C 2023年5月22日
    00
  • 详解C++编程中的变量相关知识

    详解C++编程中的变量相关知识 C++变量的定义 在C++中定义变量需要指定变量类型和变量名,语法如下: <type> <identifier> [=<initializer>]; <type>:变量类型,如int、char、float、double等。 <identifier>:变量名,由字母、数…

    C 2023年5月23日
    00
  • 一起来学习C语言的字符串转换函数

    一起来学习C语言的字符串转换函数 为什么要学习字符串转换函数 在C语言中,字符串处理非常常见,那么在字符串的处理过程中,必然需要将一些数字或其他类型的数据转换成字符串以实现一些输出的需求,或者将一个字符串转换成数字或其他类型的数据以实现一些计算的需求。因此,掌握字符串转换函数在C语言中是非常有必要和基础的。 两类字符串转换函数 在C语言中有两类字符串转换函数…

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