洛谷 P1217 [USACO 1.5] 回文质数 Prime Palindrome

这篇题解完全就是为了让我不要忘记回文数是怎么判断的(笑哭

原题目传送门(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;
}
posted @ 2021-12-30 08:18  煎饼Li  阅读(65)  评论(0编辑  收藏  举报