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

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

题目描述
定义两个相差为 2 2 2 的素数称为素数对,如 5 5 5 7 , 17 7,17 7,17 19 19 19 等,要求找出所有两个数均不大于 n n n 的素数对。
输入格式
一个正整数 n n n 1 ≤ n ≤ 10000 1 \le n \le 10000 1n10000
输出格式
所有小于等于 n n n 的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出 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 ≤ 10000 1 \le n \le 10000 1n10000,使用 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+2
    if(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---

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

我们下集见~

posted @ 2025-09-26 13:22  wzzkaifa  阅读(15)  评论(0)    收藏  举报