P1217 [USACO1.5]回文质数 Prime Palindromes
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
5 500
输出格式
5
7
11
101
131
151
181
191
313
353
373
383
说明与提示
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
思路:题目需要实现的功能非常简单,但需要注意的是该题目有“高性能”的tag,这意味着在时间或空间方面有所要求,实现起来要注意优化。素数筛选可以使用欧拉线筛或埃式线筛。
Code:
#include <bits/stdc++.h>
#include <algorithm>
#define PI 3.141593
#define INF 0x3f3f3f3f
#define Best 0x7fffffff
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
const int M = 2e8 + 5;
bool S(long long int num) {
if (num <= 3) {
return num > 1;
}
if (num % 6 != 1 && num % 6 != 5) {
return 0;
}
int b = (long long int)sqrt(num);
for (int i = 5; i <= b; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return 0;
}
}
return 1;
}
bool H(long long int num) {
long long int temp, sum = 0;
temp = num;
while (temp != 0) {
sum = sum * 10 + temp % 10;
temp = temp / 10;
}
if (sum == num && num > 0)
{
return 1;
}
else
{
return 0;
}
}
int main() {
long long int a[M], n = 0, s = 0, b, c;
cin >> b >> c;
for (long long int i = b; i <= c; i++) {
a[i] = i;
if (a[i] == 10000000)
break;
if (H(a[i]) == 1 && S(a[i]) == 1) {
n++;
cout << a[i] << endl;
}
}
return 0;
}