题目来源:http://noi.openjudge.cn/ch0113/11/
回文素数
-----------------------------------------------------
总时间限制:
5000ms
内存限制:
65536kB
描述
一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。
输入
位数n,其中1<=n<=9。
输出
第一行输出满足条件的素数个数。
第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分。
样例输入
1
样例输出
4
2 3 5 7
-----------------------------------------------------
解题思路
部分规避遍历:
对n位数,仅考虑n/2位的遍历并计算其回文数拼接成n位数,然后再判断是否是质数。
-----------------------------------------------------
代码
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
int zhishu(int n)
{
int i=0;
if(n==1)
{
return 0;
}
if(n==2||n==3)
{
return 1;
}
for (i=2; i<=sqrt(n); i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int power(int x, int y) // C++中没有整型的power函数(pow是浮点型的)
{
int result = 1;
if (y==0)
{
return 1;
}
for (int i=0; i<y; i++)
{
result *= x;
}
return result;
}
int huiwen(int n, int w) // 构造一个数的回文数
{
int d=0, i=0, result = 0;
for (i=w; i>0; i--)
{
d = (n%power(10,i))/power(10,i-1);
result += d*power(10,w-i);
}
return result;
}
int main()
{
int n,i,tmp,j;
cin >> n;
int beg=0, en=0,cnt=0;
vector<int> out;
if(n==1)
{
cout << "4" << endl << "2 3 5 7";
}
else if(n%2==0)
{
beg = power(10,n/2-1);
en = power(10,n/2);
for (i=beg; i<en; i++)
{
tmp = i*power(10,n/2)+huiwen(i,n/2);
if(zhishu(tmp)==1)
{
cnt++;
out.push_back(tmp);
}
}
cout << cnt << endl;
for (i=0; i<cnt; i++)
{
cout << out[i] << " ";
}
}
else
{
beg = power(10,n/2-1);
en = power(10,n/2);
for (i=beg; i<en; i++)
{
for (j=0; j<10; j++)
{
tmp = i*power(10,n/2+1)+j*power(10,n/2)+huiwen(i,n/2);
if(zhishu(tmp)==1)
{
cnt++;
out.push_back(tmp);
}
}
}
cout << cnt << endl;
for (i=0; i<cnt; i++)
{
cout << out[i] << " ";
}
}
return 0;
}