题目大意
输出a-b内的回文质数。范围为1-1e。
分析思路
先构造回文数再判断质数肯定更快。
然而题目所给打印回文数的方式为:
产生长度为5的回文数:
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) { for (d3 = 0; d3 <= 9; d3++) { palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...) } } }
所以我写了5个不同长度的for。。。
法二:
通过打表观察发现只有11是偶数位的回文质数,所以直接把11加入队列中。只需要判断奇数位的回文数:
也就是123 12 1232 12321
AC
#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <vector>
#define MAXN 10000
using namespace std;
typedef long long LL;
priority_queue <int, vector<int>,greater<int> > pq;
bool is_prime(int x)
{
for(int i=2; i<sqrt(x+0.5); i++) {
if(x % i == 0) return false;
}
return true;
}
int main()
{
while(!pq.empty()) pq.pop();
pq.push(11);
int sum, tmp;
for(int i=2; i<MAXN; i++) {
sum=i;
for(tmp=i/10; tmp!=0; tmp/=10)
sum = sum*10 + tmp%10;
if(is_prime(sum))
pq.push(sum);
}
while(!pq.empty()) {
cout << pq.top() << endl;
pq.pop();
}
return 0;
}
题意Ac Code
#include<iostream>
#include<cmath>
using namespace std;
int obj[20000];
int product(){
int cnt=0;
for(int i=5;i<10;i++){
obj[cnt]=i;cnt++;
} //1
for(int i=1;i<10;i++){
obj[cnt++]=i*10+i;
}//2
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
obj[cnt++]=i*100+j*10+i;
}
}//3
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
obj[cnt++]=i*1000+j*100+j*10+i;
}
}//4
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++)
obj[cnt++]=i*10000+j*1000+k*100+j*10+i;
}
}//5
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++)
obj[cnt++]=i*100000+j*10000+k*1000+k*100+j*10+i;
}
}//6
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++)
for(int l=0;l<10;l++)
obj[cnt++]=i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i;
}
}//7
for(int i=1;i<10;i++){
for(int j=0;j<10;j++){
for(int k=0;k<10;k++)
for(int l=0;l<10;l++)
obj[cnt++]=i*10000000+j*1000000+k*100000+l*10000+l*1000+k*100+j*10+i;
}
}//8
/*for(int i=1;i<10;i++){
for(int j=1;j<10;j++){
for(int k=1;k<10;k++)
for(int l=1;l<10;l++)
for(int m=1;m<10;m++){
obj[cnt++]=i*100000000+j*10000000+k*1000000+l*100000+m*10000+l*1000+k*100+j*10+i;
}
}
}//9
*/
return cnt;
}
int main()
{
int len=14760;
product();
int a,b;
cin>>a>>b;
for(int i=0;i<len;i++){
if(obj[i]<a) continue;
if(obj[i]>b) break;
int q=sqrt(obj[i]),j,flag=1;
for(j=2;j<=q;j++){
if(obj[i]%j==0){
flag=0;
//cout<<obj[i]<<"res"<<j<<endl;
break;
}
}
if(flag)cout<<obj[i]<<endl;
}
return 0;
}