《信息学奥赛一本通》第131题:素数对
题目描述
定义两个相差为 222 的素数称为素数对,如 555 和 7,177,177,17 和 191919 等,要求找出所有两个数均不大于 nnn 的素数对。
输入格式
一个正整数 nnn。1≤n≤100001 \le n \le 100001≤n≤10000。
输出格式
所有小于等于 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 题:素数对。
一、题目描述
洛谷的题号是:B2132 素数对
二、题意分析
这道题是信息学奥赛一本通练习题的第 131 题。
根据输入格式的描述,输入只有一个整数 n,数据范围:1≤n≤100001 \le n \le 100001≤n≤10000,使用 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
}
按照样例输入对数据进行验证。
符合样例输出,到网站提交测评。
发现有两个错误点,检查代码,发现是主函数的循环出现了问题,因为要输出 i+2,而 i+2 要到 n 就停止,但循环中却写了 n,因此最终的 i 会到 n+2 ,所以在主函数中修改。
for(int i=2;i<=n-2;i++)
再次提交。
测试通过!
三、完整代码
该题的完整代码如下:
#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)输出格式不符合要求,例如遗漏空格或未换行。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~