-
总时间限制:
- 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位数,那么就循环了数千万次。。。我太天真了。
-
PS :通过构造回文数,而不是去判断是不是回文数。n为偶数时,既是回文数又是素数的不存在的。为什么呢?简单证明。
-
学习了学习了。