【HDU1431 素数回文】

这种多组输入的第一想法是打表,但数据太大,果然超时,然后就用暴力法了,一样超时,但是这道题如果把i限制在1e7时竟然能通过。
原来:这是一个技巧,我们可以尝试找出最大的回文素数来,发现范围内的最大回文素数为9989899,这样就可以节省好多时间!

#include <iostream>
#include <algorithm> 
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>
#include <bitset> 
#include <unordered_map>
#include <unordered_set>
#define vi vector<int> 
#define si set<int>
#define pi pair<int,int> 
#define pii pair<ll,ll> 
#define pb push_back
#define mp make_pair
#define lowbit(x) (x&(-x))
#define sci(x) scanf("%d",&(x))
#define scll(x) scanf("%lld",&(x))
#define sclf(x) scanf("%lf",&(x))
#define pri(x) printf("%d",(x))
#define rep(i,j,k) for(int i=j;i<=k;++i)
#define per(i,j,k) for(int i=j;i>=k;--i)
#define mem(a,b) memset(a,b,sizeof(a)) 
using namespace std;
bool isPrime(int n){
	for(int i=2;i*i<=n;i++){
		if(n%i==0)
		return false;
	}
	return true;
}
int isPr(int n){
	int pr[20];
	int t=0;
	while(n){
		pr[t++]=n%10;
		n/=10;
	}
for(int i=0,j=t-1;i<t/2;i++,j--)
        if(pr[i]!=pr[j])
            return 0;
	return 1;
}
int main(){
	int a,b;
	while(scanf("%d%d",&a,&b)!=EOF){
		for(int i=a;i<=b&&i<10000000;i++){
			if(isPr(i)&&isPrime(i)){
				printf("%d\n",i);
			}
		}
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/88369784