这篇题解完全就是为了让我不要忘记回文数是怎么判断的(笑哭
原题目传送门(P1217 [USACO 1.5] 回文质数 Prime Palindrome)
开局一条分割线,就问你服不服?(orz
这道题的关键就在于判断回文数。那到底怎么判断回文数呢?
我们首先需要传入一个数(废话),然后在判断函数内新建一个tmp临时变量来存储我们当前这个数(就是怕出错),并且再新建一个变量num
来逐位存储我们当前的数。
在此之后,我们每一次取出当前要判断的这个数的末位,并把它添加到我们的新变量中,并把传入的数的末位弹出。
在此之后,继续此操作。
如果最终我们新开的专门来存储当前数末位的数的结果和原数相同,那么它就是回文数,返回true
。否则,就不是回文数,返回false
。
代码片段
bool is_palindrome(int n){
int tmp=n,num=0;
while (tmp!=0){
num=num*10+tmp%10;
tmp/=10;
}
if (num==n) return 1;
else return 0;
}
开局又一条分割线,就问你服不服?(orz
因为这道题需要求的是质数的回文数,那么我们再增加一个判断质数的函数(这个是最简单的判断质数的方法)。
搞一个循环变量i
,从2一直循环到n的平方根(可以自行百度)。在此过程中,如果n
能够整除i
就说明它不是质数,返回false
。最终,经过一系列测试过后,说明它是质数,就返回true
。
代码片段
bool is_prime(int n){
for (int i=2;i<=sqrt(n);i++){
if (n%i==0) return false;
}
return true;
}
上代码(请勿抄袭(狗头
#include <bits/stdc++.h>
using namespace std;
int n,m;
bool is_prime(int n){
for (int i=2;i<=sqrt(n);i++){
if (n%i==0) return false;
}
return true;
}
bool is_palindrome(int n){
int tmp=n,num=0;
while (tmp!=0){
num=num*10+tmp%10;
tmp/=10;
}
if (num==n) return 1;
else return 0;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=n;i<=m;i++){
if (i==9989900){
break;
}
if (is_palindrome(i) && is_prime(i)){
printf("%d\n",i);
}
}
system("pause");
return 0;
}