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;
}
posted @ 2020-09-03 07:30  琦桢  阅读(281)  评论(0编辑  收藏  举报