老题新解|素数回文数的个数
《信息学奥赛一本通》第135题:素数回文数的个数
题目描述
求 111111 到 nnn 之间(包括 nnn),既是素数又是回文数的整数有多少个。
输入格式
一个大于 111111 小于 100001000010000 的整数 nnn。
输出格式
111111 到 nnn 之间的素数回文数个数。
输入输出样例 #1
输入 #1
23
输出 #1
1
说明/提示
回文数指左右对称的数,如:111111,121211212112121。
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 135 题:素数回文数的个数。
一、题目描述
洛谷的题号是:B2136 素数回文数的个数
二、题意分析
这道题是信息学奥赛一本通练习题的第 135 题。
根据输入格式的描述,输入一个大于 11 小于 10000 的整数 n,所以使用 int 类型。
int n;
cin>>n;
输入完成后,我们来分析题意,根据题目意思,我们要找 11 到 n 之间素数回文数的个数。
所以需要使用 for 循环从 11 遍历到 n,可以使用函数来判断这个数是否为素数并且是回文数,我们可以使用函数来完成这两个功能。
for(int i=11;i<=n;i++)
{if(pdss(i)==true&&hws(i)==true){}
}
如果是素数并且是回文数,则进行累加统计,定义一个累加变量,初始值为 0。
int cnt=0;
for(int i=11;i<=n;i++)
{if(pdss(i)==true&&hws(i)==true){cnt++;}
}
只需要输出 cnt 即可。
cout<<cnt;
我们来完成判断素数的函数,利用素数的性质来实现。
#include<cmath>
bool pdss(int k)
{if(k==1){return false;//1不是素数}else{//在除1和本身以外找因数for(int i=2;i<=sqrt(k);i++){if(k%i==0)//能整除{return false;//不是素数}}return true;//是素数}
}
接下来完成回文数的判断,回文数就是前后读都一样,所以我们需要将数值拆分,并且计算出倒序的值,判断参数是否和倒序的值是否一致,如果一致,则返回 true,否则返回 false。
bool hws(int p)
{int sum=0;//求p的倒序的值 初始值为0while(p!=0)//拆分p{sum=sum*10+p%10;//倒序p/=10;//缩小p}if(sum==p){return true;}else{return false;}
}
将函数添加到主函数之前,按照样例输入对数据进行验证。
结果不正确,验证一下,可以输出 hws(11),发现是回文数函数出错了,检查代码,发现是 p 和 sum 比较,这是错误的,因为 p 最终的结果是 0,所以我们应该提前将 p 的值提取出来,修正代码,利用新变量 g 和 sum 比较即可。
bool hws(int p)
{int g=p;int sum=0;//求p的倒序的值 初始值为0while(p!=0)//拆分p{sum=sum*10+p%10;//倒序p/=10;//缩小p}if(sum==g){return true;}else{return false;}
}
按样例再次测试。
符合样例输出,到网站提交测评。
测试通过!
三、完整代码
该题的完整代码如下:
#include<cmath>
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
bool hws(int p)
{int g=p;int sum=0;//求p的倒序的值 初始值为0while(p!=0)//拆分p{sum=sum*10+p%10;//倒序p/=10;//缩小p}if(sum==g){return true;}else{return false;}
}
bool pdss(int k)
{if(k==1){return false;//1不是素数}else{//在除1和本身以外找因数for(int i=2;i<=sqrt(k);i++){if(k%i==0)//能整除{return false;//不是素数}}return true;//是素数}
}
int main()
{int n;cin>>n;int cnt=0;for(int i=11;i<=n;i++){if(pdss(i)==true&&hws(i)==true){cnt++;}}cout<<cnt;return 0;
}
四、总结
本题考察了素数判断与回文数判断,主要知识点如下:
1、知识点总结
(1)素数判断:利用从 2 到 √n 循环判断是否能整除即可。
(2)回文数判断:将数字倒序后与原数字比较是否相等。
(3)循环统计:使用 for 循环遍历范围 [11, n]
,对每个数进行判断并计数。
(4)函数封装:素数判断和回文判断分别封装为函数,增强代码可读性和复用性。
2、常见易错点:
(1)回文数判断时,直接比较循环过程中修改后的变量 p 与倒序值 sum,容易出错,应提前保存原值。
(2)素数判断时,循环上限最好取 √k,提高效率。
(3)计数时要确保循环范围从 11 开始,包括 n,否则可能漏掉边界值。
3、解题建议
本题适合练习函数封装与条件判断的结合,逻辑清晰,先判断素数,再判断回文数。对范围较大的 n,素数判断可优化为开平方,提高效率。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~