[USACO1.5]回文质数 Prime Palindromes

题目描述

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

输入输出格式

输入格式:

第 1 行: 二个整数 a 和 b .

输出格式:

输出一个回文质数的列表,一行一个。


如果直接进行枚举,则显然会超时,显然需要进行剪枝。

首先,可以通过试验得到,当回文数的位数是偶数时,可以被11整除,此时将不是质数。

同时,在一段区间内,质数的个数一般是多于回文数的个数,而&&为短路的运算符,可以判断是否为回文后再判断是否为质数。

#include<bits/stdc++.h>
using namespace std;
bool pre(int x)
{
	int a[1000];
	int i=0;
	while (x)
	{
		a[++i]=x%10; x/=10;
	}
	//if(i%2==0) return false;
	for (int j=1;j<=i/2;j++) 
	  if (a[j]!=a[i-j+1]) return false;
	return true;
}
bool prime(int x)
{
	if (x==2) return true;
	int k=2;
	while (k<=sqrt(x)&&x%k!=0) k++;
	if (k<=sqrt(x)) return false;
	else return true;
}
int main()
{
	int a,b;
	cin>>a>>b;
	for (int i=a;i<=b;i++)
	{
	  if(i>=1000&&i<=9999||i>=100000&&i<=999999||i>=10000000&&i<=99999999) continue;
	  if( pre(i)&&prime(i)) printf("%d\n",i);
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/bond0909/article/details/80077813