PAT乙级1007

常规解法

#include <iostream>
using namespace std;// 判断一个数是否为素数的函数
bool isprime(int a) {// 遍历 2 到 sqrt(a) 之间的数,判断 a 是否能被它们整除for (int i = 2; i * i <= a; i++) {if (a % i == 0)  // 如果能整除,说明 a 不是素数return false;}return true;  // 如果没有找到能整除的数,说明 a 是素数
}int main() {int N, cnt = 0;  // N 为输入的数字,cnt 用于统计符合条件的素数对数量cin >> N;  // 输入一个正整数 N// 从 5 开始遍历到 N,因为素数对的第一位素数必须从 5 开始// 对于每一个 i,检查 i 和 i-2 是否为素数for (int i = 5; i <= N; i++) {// 检查 i 和 i-2 是否都是素数if (isprime(i - 2) && isprime(i)) {cnt++;  // 如果是素数对,增加计数}}cout << cnt;  // 输出符合条件的素数对的数量return 0;
}

代码解析:
1. isprime(int a):
这是一个判断一个数是否为素数的函数。它通过遍历从 2 到 sqrt(a) 的整数,检查 a 是否能被这些数整除。如果能整除,返回 false,说明 a 不是素数;如果不能整除,返回 true,说明 a 是素数。
2. main():
• 读取输入的整数 N,表示我们要检查的素数范围。
• 变量 cnt 用来统计符合“差为 2 的素数对”的个数。
• 从 5 开始遍历直到 N,因为我们只关心从 5 开始的素数对(即差为 2 的素数对的第一个素数从 5 开始)。
• 对于每个 i,检查 i 和 i-2 是否都是素数,如果是,说明它们是一个符合条件的素数对,增加计数 cnt。
• 最后输出符合条件的素数对的数量。

示例:

输入:

20

输出:

4

解释:
• 在小于等于 20 的素数中,存在以下符合条件的素数对:
• (5, 7)
• (11, 13)
• (17, 19)
• 总共 3 对符合条件,因此输出结果是 3。

优化建议:
• 时间复杂度: isprime 函数的时间复杂度是 O(sqrt(a)),所以整体代码的时间复杂度是 O(N * sqrt(N)),这对于最大 N = 100000 可能有一定的性能瓶颈。为了进一步提高性能,可以考虑使用埃拉托斯特尼筛法来预先计算素数。

素数筛选法

埃拉托斯特尼筛法(Sieve of Eratosthenes) 是一种用于计算某个范围内所有素数的高效算法。它由古希腊数学家埃拉托斯特尼提出,主要通过标记非素数来逐步筛选出素数。这个方法非常适用于寻找小范围内的所有素数,时间复杂度为 O(n log log n),其中 n 是上限。

埃拉托斯特尼筛法的基本思想:
1. 假设我们需要找出 1 到 n 之间的所有素数。
2. 首先假设所有的数字都是素数,将所有数字标记为“可能是素数”。
3. 从 2 开始,检查每个数字:
• 如果该数字被标记为素数,则从它的平方开始,将它的所有倍数标记为“非素数”。
• 继续处理下一个未标记的数字,直到所有数字处理完成。
4. 剩下标记为“素数”的数字即为所有素数。

具体步骤:
1. 创建一个布尔数组 is_prime,数组大小为 n+1,并将所有元素初始化为 true(表示所有数字都是素数)。
2. 标记 is_prime[0] 和 is_prime[1] 为 false,因为 0 和 1 不是素数。
3. 从 2 开始,检查每个数字:
• 如果 is_prime[i] 为 true,则从 i * i 开始标记 i 的所有倍数为非素数。
• 重复这个过程,直到 i * i > n。
4. 最后,所有 is_prime[i] 为 true 的位置 i 对应的数字就是素数。

示例:寻找小于等于 20 的所有素数

步骤:
1. 初始化布尔数组 is_prime[0…20]:

is_prime[0…20] = {false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true}

2.	从 2 开始,处理数字 2:
•	标记 2 的倍数:4, 6, 8, 10, 12, 14, 16, 18, 20 为非素数。
•	更新 is_prime 数组:

is_prime[0…20] = {false, false, true, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false}

3.	处理下一个未被标记的数字 3:
•	标记 3 的倍数:9, 12, 15, 18 为非素数。
•	更新 is_prime 数组:

is_prime[0…20] = {false, false, true, true, false, true, false, true, false, false, false, true, false, true, false, true, false, true, false, true, false}

4.	继续处理 5、7 等,直到所有数字处理完。

最终,is_prime 数组中标记为 true 的位置对应的数字是素数:

2, 3, 5, 7, 11, 13, 17, 19

C++ 实现:

#include
#include
using namespace std;

void sieve_of_eratosthenes(int n) {
// 创建一个布尔数组,初始化为 true,表示所有数都是素数
vector is_prime(n + 1, true);
is_prime[0] = is_prime[1] = false; // 0 和 1 不是素数

// 从 2 开始,筛选出所有的素数
for (int i = 2; i * i <= n; i++) {if (is_prime[i]) {  // 如果 i 是素数for (int j = i * i; j <= n; j += i) {is_prime[j] = false; // 将 i 的倍数标记为非素数}}
}// 输出所有素数
for (int i = 2; i <= n; i++) {if (is_prime[i]) {cout << i << " ";}
}
cout << endl;

}

int main() {
int N;
cin >> N;
sieve_of_eratosthenes(N); // 输出不超过 N 的所有素数
return 0;
}

代码解释:
1. 布尔数组 is_prime: 用来标记数字是否是素数,初始化时将所有数字标记为 true。
2. 筛选过程: 从 2 开始,如果某个数是素数,则标记它的倍数为 false,直到 i * i > n。
3. 输出素数: 在所有数字处理完后,输出 is_prime 数组中标记为 true 的数字。

优点:
• 高效性: 埃拉托斯特尼筛法的时间复杂度为 O(n log log n),比简单的逐个检查每个数字是否为素数要高效得多。
• 适用于较大的 n: 即使对于较大的 n,这个算法仍然能在合理的时间内找到所有素数。

复杂度:
• 时间复杂度: O(n log log n),对于 n 范围内的素数查找非常高效。
• 空间复杂度: O(n),用于存储 is_prime 数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/39983.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 中装饰者模式与策略模式在埋点系统中的应用

前言 在软件开发中&#xff0c;装饰者模式和策略模式是两种常用的设计模式&#xff0c;它们在特定的业务场景下能够发挥巨大的作用。本文将通过一个实际的埋点系统案例&#xff0c;探讨如何在 Java 中运用装饰者模式和策略模式&#xff0c;以及如何结合工厂方法模式来优化代码…

HCIP_NOTE03_网络组成

网络组成 LAN MAN WAN 园区网 企业或机构内部的网络,分大中小型 行业园:企业园网 校园网 政务园 商业园 三层交换机 数据大量交换的局域网内部,转发效率高,有简单的路由功能 路由器 进出口网络,适用于复杂的网络环境,选路需求 无线网 信号传输稳定性差---- 电磁波易受干…

简记_单片机硬件最小系统设计

以STM32为例&#xff1a; 一、电源 1.1、数字电源 IO电源&#xff1a;VDD、VSS&#xff1a;1.8~3.6V&#xff0c;常用3.3V&#xff0c;去耦电容1 x 10u N x 100n &#xff1b; 内核电源&#xff1a;内嵌的稳压器输出&#xff1a;1.2V&#xff0c;给内核、存储器、数字外设…

32.[前端开发-JavaScript基础]Day09-元素操作-window滚动-事件处理-事件委托

JavasScript事件处理 1 认识事件处理 认识事件(Event) 常见的事件列表 认识事件流 2 事件冒泡捕获 事件冒泡和事件捕获 事件捕获和冒泡的过程 3 事件对象event 事件对象 event常见的属性和方法 事件处理中的this 4 EventTarget使用 EventTarget类 5 事件委托模式 事件委托&am…

LeetCode hot 100 每日一题(15)——48.旋转图像

这是一道难度为中等的题目&#xff0c;让我们来看看题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…

图灵300题-21~40-笔记002

图灵300题 图灵面试题视频&#xff1a;https://www.bilibili.com/video/BV17z421B7rB?spm_id_from333.788.videopod.episodes&vd_sourcebe7914db0accdc2315623a7ad0709b85&p20。 本文是学习笔记&#xff0c;如果需要面试没有时间阅读原博文&#xff0c;可以快速浏览笔…

09_从经典论文入手Seq2Seq架构

Sequence to Sequence 架构 Paper链接 Sequence to Sequence Learning with Neural Networks B站课程ShusenWang 核心思想 关键的改进点 In this paper, we show that a straightforward application of the Long Short-Term Memory (LSTM) architecture [16] can solve …

大疆上云api介绍

概述 目前对于 DJI 无人机接入第三方云平台,主要是基于 MSDK 开发定制 App,然后自己定义私有上云通信协议连接到云平台中。这样对于核心业务是开发云平台,无人机只是其中一个接入硬件设备的开发者来说,重新基于 MSDK 开发 App 工作量大、成本高,同时还需要花很多精力在无人…

3、孪生网络/连体网络(Siamese Network)

目的&#xff1a; 用Siamese Network (孪生网络) 解决Few-shot learning (小样本学习)。 Siamese Network并不是Meta Learning最好的方法&#xff0c; 但是通过学习Siamese Network&#xff0c;非常有助于理解其他Meta Learning算法。 这里介绍了两种方法&#xff1a;Siame…

OpenCV图像拼接(7)根据权重图对源图像进行归一化处理函数normalizeUsingWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::normalizeUsingWeightMap 是 OpenCV 中用于图像拼接细节处理的一个函数。它根据权重图对源图像进行归一化处理&#xff0c;通常用于…

卷积神经网络 - AlexNet各层详解

AlexNet的层次化设计&#xff0c;使得 AlexNet 能够逐层提取从简单边缘到复杂图形的特征&#xff0c;同时结合归一化、池化和 Dropout 技术&#xff0c;有效提升了训练速度和泛化能力&#xff0c;成为推动深度学习发展的重要里程碑。本文我们来理解AlexNet各层的参数设置以及对…

【设计模式】工厂模式

首先了解一下什么是工厂方法模式&#xff1f; 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种方法来封装对象的创建逻辑。具体来说&#xff0c;它通过定义一个创建对象的接口&#xff08;即工厂方法&#xff09;&a…

centos 7 部署FTP 服务用shell 脚本搭建

#!/bin/bash# 检查是否以root身份运行脚本 if [ "$EUID" -ne 0 ]; thenecho "请以root身份运行此脚本。"exit 1 fi# 安装vsftpd yum install -y vsftpd# 启动vsftpd服务并设置开机自启 systemctl start vsftpd systemctl enable vsftpd# 配置防火墙以允许F…

基于Spring Boot的个性化商铺系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

AI(DeepSeek、ChatGPT)、Python、ArcGIS Pro多技术融合下的空间数据分析、建模与科研绘图及论文写作

人工智能&#xff08;AI&#xff09;与ArcGIS Pro的结合&#xff0c;为空间数据处理和分析开辟了前所未有的创新路径。AI通过强大的数据挖掘、深度学习及自动化能力&#xff0c;可高效处理海量、多源、异构的空间数据&#xff0c;极大提升了分析效率与决策支持能力。而ArcGIS P…

2025最新3个wordpress好用的主题

红色大气的wordpress企业主题&#xff0c;适合服务行业的公司搭建企业官方网站使用。是一款专为中小企业和个人开发者设计的WordPress主题&#xff0c;旨在提供专业的网站构建解决方案。 通过此WordPress主题&#xff0c;用户可以轻松创建和维护一个专业的企业网站&#xff0c…

Spring AI Alibaba AudioModel使用

一、AudioModel简介 1、AudioModel 当前&#xff0c;Spring AI Alibaba 支持以下两种通义语音模型的适配&#xff0c;分别是&#xff1a; 文本生成语音 SpeechModel&#xff0c;对应于 OpenAI 的 Text-To-Speech (TTS) API录音文件生成文字 DashScopeAudioTranscriptionMode…

时隔多年,终于给它换了皮肤,并正式起了名字

时隔多年&#xff0c;终于更新了直播推流软件UI&#xff0c;并正式命名为FlashEncoder。软件仍使用MFC框架&#xff0c;重绘了所有用到的控件&#xff0c;可以有效保证软件性能&#xff0c;也便于后续进一步优化。 下载地址&#xff1a;https://download.csdn.net/download/Xi…

Python备赛笔记2

1.区间求和 题目描述 给定a1……an一共N个整数&#xff0c;有M次查询&#xff0c;每次需要查询区间【L,R】的和。 输入描述: 第一行包含两个数&#xff1a;N,M 第二行输入N个整数 接下来的M行&#xff0c;每行有两个整数&#xff0c;L R&#xff0c;中间用空格隔开&…

各类神经网络学习:(四)RNN 循环神经网络(下集),pytorch 版的 RNN 代码编写

上一篇下一篇RNN&#xff08;中集&#xff09;待编写 代码详解 pytorch 官网主要有两个可调用的模块&#xff0c;分别是 nn.RNNCell 和 nn.RNN &#xff0c;下面会进行详细讲解。 RNN 的同步多对多、多对一、一对多等等结构都是由这两个模块实现的&#xff0c;只需要将对输入…