当前位置: 首页 > news >正文

实用指南:老题新解|素数对

《信息学奥赛一本通》第131题:素数对

题目描述
定义两个相差为 222 的素数称为素数对,如 5557,177,177,17191919 等,要求找出所有两个数均不大于 nnn 的素数对。
输入格式
一个正整数 nnn1≤n≤100001 \le n \le 100001n10000
输出格式
所有小于等于 nnn 的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出 empty
输入输出样例 #1
输入 #1
10
输出 #1
3 5
5 7
输入输出样例 #2
输入 #2
100
输出 #2
3 5
5 7
11 13
17 19
29 31
41 43
59 61
71 73
输入输出样例 #3
输入 #3
3
输出 #3
empty

大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 131 题:素数对。

image.png

一、题目描述

洛谷的题号是:B2132 素数对

image.png

二、题意分析

这道题是信息学奥赛一本通练习题的第 131 题。

根据输入格式的描述,输入只有一个整数 n,数据范围:1≤n≤100001 \le n \le 100001n10000,使用 int 类型。

int n;
cin>>n;

输入完成后,我们来分析题意,根据题目描述,我们需要找到两个相差为 2 的素数对,并将所有不大于 n 的素数对输出。

所以我们需要使用 for 循环变量遍历,从 2 开始到 n。

for(int i=2;i<=n;i++)
{
}

中间加上判断素数的函数,只要符合就输出数据。

素数的函数写法如下,孰能生巧,直接写出,根据素数的特点写出函数:

bool pdss(int k)
{
if(k==1) return false;
else
{
//除1和本身的数以外能找到整除的数
for(int i=2;i<k;i++)
{
if(k%i==0) return false;
}
return true;
//返回真
}
}

将函数添加进主函数中。

for(int i=2;i<=n;i++)
{
//符合素数特点 输出i和i+2
if(pdss(i)==true&&
pdss(i+2)==true)
{
cout<<i<<
" "<<i+2<<endl;
}
}

如果不存在素数对,就输出 empty,可以加上一个标记,如果找到就标记为一个数,最后判断这个数据即可。

int flag=1;
for(int i=2;i<=n;i++)
{
//符合素数特点 输出i和i+2
if(pdss(i)==true&&
pdss(i+2)==true)
{
cout<<i<<
" "<<i+2<<endl;
//找到数据将数据置为其他数
flag=0;
}
}

判断 flag 是否为 1,如果为 1,则输出 empty。

if(flag==1)
{
cout<<
"empty";
//不存在就输出empty
}

按照样例输入对数据进行验证。

image.png

符合样例输出,到网站提交测评。

image.png

发现有两个错误点,检查代码,发现是主函数的循环出现了问题,因为要输出 i+2,而 i+2 要到 n 就停止,但循环中却写了 n,因此最终的 i 会到 n+2 ,所以在主函数中修改。

for(int i=2;i<=n-2;i++)

再次提交。

image.png

测试通过!

三、完整代码

该题的完整代码如下:

#include<iostream>#include<bits/stdc++.h>using namespace std;bool pdss(int k){if(k==1) return false;else{//除1和本身的数以外能找到整除的数for(int i=2;i<k;i++){if(k%i==0) return false;}return true;//返回真}}int main(){int n;cin>>n;int flag=1;for(int i=2;i<=n-2;i++){//符合素数特点 输出i和i+2if(pdss(i)==true&&pdss(i+2)==true){cout<<i<<" "<<i+2<<endl;//找到数据将数据置为其他数flag=0;}}if(flag==1){cout<<"empty";//不存在就输出empty}return 0;}

四、总结

本题考察了素数判定与循环遍历的应用,主要涵盖以下知识点:

(1)通过自定义函数判断素数,利用除法特性进行判定。

(2)使用 for 循环遍历 2 到 n-2,避免越界访问 i+2。

(3)利用逻辑与运算符 && 同时判断 i 和 i+2 是否为素数。

(4)通过 flag 标记是否存在素数对,最后根据 flag 的值决定输出结果。

(5)熟悉基本输入输出和条件判断的使用方法。

常见易错点:

(1)循环范围写成 i <= n,导致输出越界(i+2 > n)。

(2)素数判定函数未正确处理 k=1 或边界情况,可能误判。

(3)素数判断写成 for (int i=2; i<k; i++),效率较低,若未优化到 sqrt(k) 容易超时(大数据时)。

(4)忘记设置 flag 或 flag 初值错误,导致没有素数对时输出异常。

(5)输出格式不符合要求,例如遗漏空格或未换行。

---end---

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~

我们下集见~

http://www.gsyq.cn/news/12226.html

相关文章:

  • 人文领域的创新乏力:当价值内卷遇上元人文AI的破局之光
  • [iOS] OC高级编程 - 引用计数 (1) - 详解
  • AI论文速读 | 当大语言模型遇上时间序列:大语言模型能否执行多步时间序列推理与推断 - 指南
  • unordered_map性能被吊打!我用基数树让内存池性能暴涨几十倍的秘密
  • 深入解析:TENGJUN“二合一(2.5MM+3.5MM)”耳机插座:JA10-BPD051-A;参数与材质说明
  • CentOS 9服务器版 部署Zabbix7.0 server端 - 详解
  • US$189 VVDI2 BMW FEM amp; BDC Functions Authorization Service With Ikeycutter Condor
  • 模式组合应用-享元模式 - 详解
  • Go 1.26 内置函数 new 新特性
  • 重要公式 - Emi
  • 软件构造中的数据处理(sql) 6章
  • Gitee vs. GitLab:中国开发者为何选择本土代码托管平台?
  • US$39 BAV-Key Adapter for Yanhua Mini ACDP
  • 级数 - Emi
  • 基于STM32的正弦波逆变器设计
  • 深入解析:SDL2视频渲染
  • 使用Ollama 0.12.2本地部署大模型,友好界面对话,开启飞行模式数据完全存在本地
  • 详细介绍:四大金刚之计算机网络
  • 物联网字节校验常用方法
  • 实用指南:RabbitMQ 核心组件详解与持久化日志队列实现方案
  • 完整教程:Zookeeper与Kafka:分布式系统中的协调与消息队列
  • 外发图纸如何控制的最佳实践与注意事项
  • Gitee:中国开发者生态的数字底座正在重构技术格局
  • 文件同步软件是什么?主要有哪几种类型?
  • “铸网2025”山东省工业和互联网CTF竞赛-web
  • 全球知名的Java Web开发平台Vaadin上线慧都网!
  • C#实现与欧姆龙PLC通信
  • 什么是跨网文件摆渡系统?IT运维效率提升300%的秘密武器
  • 借助Aspose.Email,在 Python中创建事件日历
  • C++ map 和unordered_map 的区别