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

yizhihongxing

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

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语言实现经典24点纸牌益智游戏

    C语言实现经典24点纸牌益智游戏 1. 游戏介绍 24点纸牌游戏是一款运用纸牌进行推理和计算的益智游戏,玩家通过选取牌面数字来进行四则运算,将4张牌计算得到结果24即为胜利。此游戏不仅能训练计算能力和观察能力,也能激发玩家的智力潜力和学习兴趣。 2. 程序设计思路 本程序实现主要采用C语言,主要实现思路如下: 创建一个Card结构体,包含数字和花色属性; 随…

    C 2023年5月23日
    00
  • Qt数据库应用之实现通用数据库分页

    一、引言 Qt是一款非常成熟和强大的GUI开源框架,有着丰富的组件库和强大的跨平台特性。作为一名Qt开发者,我们常常需要涉及数据库操作,而数据库分页是许多应用的常见需求。因此,本文将带领读者实现通用数据库分页的功能。 二、实现思路 在实现通用数据库分页功能,我们需要考虑以下几个问题: 如何统计数据库表的总记录数? 如何在Qt中实现查询特定记录范围的功能? 如…

    C 2023年5月22日
    00
  • Golang实现解析JSON的三种方法总结

    当我们需要解析JSON格式数据时,Golang提供了三种方法:- 使用encoding/json包- 使用第三方库github.com/tidwall/gjson- 使用第三方库github.com/json-iterator/go 1. encoding/json包解析JSON数据 在Golang中,我们可以使用标准库中的encoding/json包来解析…

    C 2023年5月23日
    00
  • 支付宝二面:使用 try-catch 捕获异常会影响性能吗(推荐)

    当我们编写程序时,难免会遇到一些异常情况,比如输入的参数不符合要求,文件不存在等等。为了防止程序发生崩溃,我们通常会使用 try-catch 语句来捕获异常。但是有些人认为,使用 try-catch 语句会影响程序的性能。那么,这种说法是否正确呢? 在实际开发中,使用 try-catch 语句捕获异常是一种很常见的做法。虽然在异常发生时会产生一定的性能损耗,…

    C 2023年5月23日
    00
  • 详解C++编程中断言static_assert的使用

    详解C++编程中断言static_assert的使用 在C++中,当我们需要在编译期进行类型检查或常量计算时,可以使用static_assert。具体来说,static_assert是一个语言特性,用于在编译期进行断言判断,如果判断条件为false,则程序会在编译期抛出一个编译错误,阻止程序的继续编译。 用法 static_assert可以用于两种类型的判断…

    C 2023年5月23日
    00
  • 贪吃蛇游戏C++命令行版实例代码

    我们来详细讲解“贪吃蛇游戏C++命令行版实例代码”的完整攻略。 1. 程序结构 在开始编写代码前,我们需要先了解程序的结构。程序需要实现以下功能: 初始化游戏地图。 生成蛇,并初始化蛇头、蛇身方向等信息。 随机生成食物。 判断蛇是否撞到了边界或者自身,以及是否吃到了食物。 更新蛇的位置。 更新游戏地图并在命令行中显示。 基于上述功能,我们可以将程序结构设计为…

    C 2023年5月24日
    00
  • C语言实现文件操作实例(简单图示讲解)

    下面是关于“C语言实现文件操作实例(简单图示讲解)”的完整攻略。 操作流程 打开文件 用fopen函数打开文件,语法如下: FILE *fopen(const char *filename, const char *mode) 其中,filename是要打开的文件名,mode是打开文件的模式(例如读取、写入、追加等),返回值是文件指针,用于后续操作。 读取文…

    C 2023年5月23日
    00
  • json中换行符的处理方法示例介绍

    对于”json中换行符的处理方法示例介绍”这个话题,下面我将进行详细讲解。 1. 问题描述 在JSON数据中,如果包含了换行符,我们在解析JSON字符串的时候很有可能会遇到一些问题。因此需要对JSON字符串中的换行符进行处理,以避免出现解析JSON时出错的情况。 2. 处理方法 2.1 用转义字符代替换行符 JSON字符串中的换行符可以用转义字符\n代替,这…

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