百练 11:回文素数

  • Post author:
  • Post category:其他


总时间限制:

5000ms

内存限制:

65536kB
描述

一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。

输入

位数n,其中1<=n<=9。

输出

第一行输出满足条件的素数个数。

第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分。

样例输入

1

样例输出

4

2 3 5 7

#include <iostream>
#include<algorithm>
#include<vector>

using namespace std;
#include<string>
#define m1 pow(10,m-1)

bool isPrime(int u){
    bool flag=true;
    for(int i=2;i<sqrt(u)+1;i++){
        if(u%i==0){
            flag=false;break;
        }
    }
    return flag;
}
vector<int> vc;
int main()
{
    int n;
    cin>>n;
    if(n==1){
        cout<<"4\n2 3 5 7";return 0;
    }
    int x=pow(10,n);
    for(int i=pow(10,n-1);i<x;i++){
        //循环获取头部进行比较。
        int m=n;
        int temp=i;
        bool flag=true;
        while(m!=1&&m!=0){
            int f=temp/m1;
            int e=temp%10;
            if(f==e){
                temp-=(f*m1);
                temp-=e;
                temp/=10;
                m-=2;
            }else{
                flag=false;break;
            }
        }
        if(flag){
            if(isPrime(i)){
                vc.push_back(i);
            }
        }
    }
    cout<<vc.size()<<'\n';
    for(vector<int>::iterator it=vc.begin();it!=vc.end();it++){
        cout<<*it;
        if(it!=vc.end()-1)
            cout<<' ';
    }
    return 0;
}

//这样写提交之后会超时。。。0分。虽然结果正确,但是这样循环着去判断肯定不行,如果是9位数,那么就循环了数千万次。。。我太天真了。


大佬的AC,点击

PS :通过构造回文数,而不是去判断是不是回文数。n为偶数时,既是回文数又是素数的不存在的。为什么呢?

简单证明。


求一亿以内的回文素数。

学习了学习了。