描述
一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。
输入
位数n,其中1<=n<=9。
输出
第一行输出满足条件的素数个数。
第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分。
样例输入
1
样例输出
4
2 3 5 7
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cmath>
using namespace std;
long long arr[8000];
bool isPrime(int n)
{
int temp = sqrt(n);
for(int i=2;i<=temp;i++)
{
if(n%i==0)
{
return false;
}
}
return true;
}
long long huiWen(int n)//例如:n等于123,返回12321这样一个回文数
{
long long ans=n;
n=n/10;
while(n>0)
{
ans=ans*10+n%10;
n=n/10;
}
return ans;
}
int myPow(int n)//因为pow库函数返回值是double类型,所以自己实现一个
{
int i;
int ans=1;
for(i=0;i<n;i++)
ans=ans*10;
return ans;
}
int main()
{
int n,l,r,t,ji,m;
long long temp,num=0;
cin>>n;
if(n==1)
{
cout<<"4\n2 3 5 7\n";
}else if(n==2){
cout<<"1\n11\n";
}else if(n%2 == 0)
{
cout<<"0\n";
}else
{
m = n/2+1;
l = myPow(m-1);
r = myPow(m);
for(int i=l;i<r;i++)
{
if(i/l==2 || i/l==4 || i/l==5 || i/l==6 || i/l==8) //最高位为2 4 5 6 8的数肯定不是质数
{
continue;
}
temp = huiWen(i);
if(isPrime(temp))
{
num++;
arr[num] = temp;
}
}
cout<<num<<endl;
for(int i=1;i<=num;i++)
{
cout<<arr[i]<<' ';
}
}
return 0;
}