题目
一个数如果从左往右读和从右往左读数字是相同的,则称这个数是回文数,如121,1221,15651都是回文数。给定位数n,找出所有既是回文数又是素数的n位十进制数。(注:不考虑超过整型数范围的情况)。
Input
位数n,其中1<=n<=9。
Output
第一行输出满足条件的素数个数。
第二行按照从小到大的顺序输出所有满足条件的素数,两个数之间用一个空格区分。
Sample Input
1
Sample Output
4
2 3 5 7
代码
#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
bool issushu(int num) {
if(num == 1)
return false;
else if(num == 2)
return true;
int i = 2;
for(i = 2; i < sqrt(num) + 1; ++i)
if(num % i == 0)
break;
if(i < sqrt(num) + 1)
return false;
else
return true;
}
int main() {
int n;
cin >> n;
if(n == 1)
cout << 4 << '\n' << 2 << ' ' << 3 << ' ' << 5 << ' ' << '7' << endl;
else if(n == 2)
cout << 1 << '\n' << 11 << endl;
else if(n % 2 == 0)
cout << 0 << endl;
else {
int i, j, k, l, ask;
queue<int> que;
n /= 2;
for(i = pow(10, n - 1); i < pow(10, n); ++i) {
for(l = 0; l < 10; ++l) {
ask = l * pow(10, n) + i * pow(10, n + 1);
k = i;
j = n - 1;
while(k != 0) {
ask = ask + (k % 10) * pow(10, j);
j--;
k = k / 10;
}
if(issushu(ask))
que.push(ask);
}
}
cout << que.size() << endl;
if(que.size()) {
cout << que.front();
que.pop();
}
while(!que.empty()) {
cout << ' ' << que.front();
que.pop();
}
}
return 0;
}
卡题原因
1.一开始考虑用字符串模拟回文数生成,然而并不需要。
2.以为素数求解会超时,但并没有。