2465: 【普及-】【P1217】回文质数 Prime Palindromes
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:16
解决:6
题目描述
因为 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 是回文质数。
写一个程序来找出范围 (一亿)间的所有回文质数。
输入
第一行输入两个正整数 和 。
输出
输出一个回文质数的列表,一行一个。
样例输入 复制
5 500
样例输出 复制
5
7
11
101
131
151
181
191
313
353
373
383
提示
提示:所有偶数位数的回文数(除了11以外)都是11的倍数,因此不是质数。
方法一:直接每个数判断是否回文和是否质数,减少循环范围。
#include<bits/stdc++.h> using namespace std; bool isPalindrome(int n) { int s=0,k=n; while(k!=0) { s*=10; s+=k%10; k/=10; } if(s==n) return true; return false; } bool isPrime(int x) { if (x==1||x==0) return false; for (int i=2;i<=sqrt(x);i++) { if(x%i==0) return false; } return true; } int main(){ int a,b; cin>>a>>b; if(a%2==0) a++; if(b>=10000000) b=10000000; for(int i=a;i<=b;i=i+2) { if(isPalindrome(i)&&isPrime(i)) { cout<<i<<endl; } } return 0; }
方法二:使用质数筛。
#include<bits/stdc++.h> using namespace std; bool isPrime[100000005]; void aiPrime(int x) { isPrime[0]=isPrime[1]=0; for (int i=2;i*i<=x;i++) { if (isPrime[i]){ for (int j=2;i*j<=x;j++) isPrime[i*j]=0; } } } bool isHW(int x) { int a,_x,t; t=x; _x=0; while (t>0) { a=t%10; t/=10; _x=_x*10+a; } return x==_x; } int main(){ int a,b; cin>>a>>b; memset(isPrime,1,sizeof(isPrime)); if (b>=10000000) b=10000000; /** 通过测试,100000000以内最大的回文质数是9989899 为了减少计算,可以限定aiPrime的最大值为10000000 **/ aiPrime(b); for (int i=a;i<=b;i++) { if (isPrime[i]&&isHW(i)) cout<<i<<endl; } return 0; }