题目名称概括所有 ………………
判断质数+判断回文
听说此范围和打表更配欧…
判断质数当然要埃式筛法啦
关于这个判断回文emmm……
最开始想借数组 费事
have a look
bool isHWS(int num) {
int temp=num,ans=0;
while (temp!=0) {
ans=ans*10+temp%10;
temp/=10;
}
if (ans==num)
return true;
else
return false;
}
倒着存一遍! 惊!?!??!?!?!!
all right
mymymy
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int a,b;
int cun[10000009],cnt;
bool pr[10000009];
void jud() {
memset(pr, true, sizeof(pr));//手动循环附1初始化会超时…………
pr[0]=pr[1]=false;
int mx=sqrt(b);
for(int i=2;i<=mx;i++)
if(pr[i]) {
for(int j=2;j<=b/i;j++)
pr[i*j]=false;
}
for(int i=a;i<=b;i++)
if(pr[i]==true) cun[++cnt]=i;
}
int pan(int x) {
int d=x,ans=0;
while(d!=0) {
ans=ans*10+d%10;
d=d/10;
}
if(ans==x) return 1;
else return 0;
}
int main() {
cin>>a>>b;
if (b>=10000000)
b=9999999;//不加会超时一个点!!!
if(a%2==0) a++;
jud();
for(int i=1;i<=cnt;i++)
if(pan(cun[i])==1) cout<<cun[i]<<endl;
return 0;
}
luogu题解
#include<bits/stdc++.h>
using namespace std;
bool book[100000001];
// 用埃氏筛法生成质数表
void prime(int b) {
//初始化,默认全部都是质数
memset(book, true, sizeof(book));
book[1]=false;//1不是质数
int n=sqrt(b);
for (int i=2;i<=n;i++) {
if (book[i]) {
//质数的倍数绝对不是质数,把所有质数的倍数全部设为false
for (int j=2;j<=b/i;j++)
book[i*j]=false; // i*j<=b
}
}
}
//判断回文数
bool isHWS(int num) {
int temp=num,ans=0;
while (temp!=0) {
ans=ans*10+temp%10;
temp/=10;
}
if (ans==num)
return true;
else
return false;
}
int main() {
int a,b;
cin>>a>>b;
//b<=10000000这个判断条件来自:除了11以外,一个数的位数是偶数的话,不可能为回文数素数。
// 如果一个回文素数的位数是偶数,则它的奇数位上的数字和与偶数位上的数字和必然相等;
// 根据数的整除性理论,容易判断这样的数肯定能被11整除,所以它就不可能是素数。
if (b>=10000000)
b=9999999;
prime(b);
if(a>b)
return 0;
if (a%2==0) a++;//除了2以外,2的倍数不可能是质数
for (int i=a;i<=b;i+=2) {
if (book[i] && isHWS(i))
cout<<i<<endl;//如果既是质数同时也是回文数,就输出。
}
return 0;
}