看到大佬写了一篇线性筛题解。本蒟蒻就补充了一篇埃氏筛的。
题意
如果一个质数(prime
),它翻转后还是质数(翻转就是
1234
→
4321
1234 \rightarrow 4321
1234→4321),则把它称为(emirp
)。
现在给你一个整数
n
n
n,请判断它是否是 emirp
。
若是,输出 n is emirp.
。
若不是 emirp
,但是是质数,输出 n is prime.
。
否则,输出 n is not prime.
。
思路
就先用埃氏筛筛出 1000000 1000000 1000000 以内的质数,再判断翻转后是否为质数,最后输出。我们可以用一个布尔数组来春每个数是否为质数。
注意
回文质数不是 emirp
。
代码
#include<bits/stdc++.h>
using namespace std;
int a;
bool v[1000005];//在本篇题解中0为是,1为不是
int main() {
//freopen("checkin.txt","r",stdin);
//freopen("checkout1.txt","w",stdout);
v[1] = 1;
v[0] = 0;
//埃氏筛
for(long long i = 2;i <= 1000000;i++) {
if(v[i]) {
continue;
}
for(long long j = i * i;j <= 1000000;j += i) {
v[j] = 1;
}
}
//输入输出
while(cin>>a) {
if(v[a]) {
printf("%d is not prime.\n",a);
}
else{
int b = a;
int c = 0;
while(b) {
c *= 10;
c += b % 10;
b /= 10;
}
if(!v[c] and a != c) {
printf("%d is emirp.\n",a);
}
else{
printf("%d is prime.\n",a);
}
}
}
}