zhongboxuan123 @ 2022-11-13 08:09:17
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e8;
int prime[maxn],cnt;
bool st[maxn];
void ol_prime(int n){
for(int i = 2;i <= n;i++)
{
if(!st[i])
{
prime[++cnt] = i;//i是素数,存储到prime数组中
}
for(int j = 1;prime[j] <= n / i;j++)
{
st[prime[j] * i] = true;//将i的质数倍数进行标记
if(i % prime[j] == 0)
{
break;
}
}
}
return ;
}
bool pd_hw(int x)
{
int y=x,num=0;//int y=x,防止x被改变
while (y!=0)
{
num=num*10+y%10;//上一次数字的记录进位再加上下一位数
y/=10;
}
if (num==x) return 1;
else return 0;
}
int main(){
int n,m;
cin>>m>>n;
ol_prime(n);
for(int i=1;i<=cnt;i++){
if(pd_hw(prime[i]) && prime[i]>=m && prime[i]<=n){
cout<<prime[i]<<endl;
}
}
return 0;
}
我这里选择了线性筛和回文判断,然后最后一点T,换了printf和scanf开了o2过了
by __er @ 2022-11-13 08:16:37
@zhongboxuan123 我用的生成回文数过的,你这不是正解吧,只是艹过去了
by Hans4103423 @ 2022-11-13 08:34:30
#include <bits/stdc++.h>
using namespace std;
bool prime[10000000];
int s,e;
int main(){
scanf("%d%d",&s,&e);
if(e > 9999999){
e = 9999999;
}
int sqrt_e = int(sqrt(e));
for(register int i = 2 ; i <= sqrt_e ; i ++){
if(!prime[i]){
for(register int j = i * i ; j <= e ; j += i){
prime[j] = 1;
}
}
}
for(register int i = s ; i <= e ; i ++){
if(!prime[i]){
int re = 0,k;
k = i;
while(k != 0){
re = re * 10 + k % 10;
k = k / 10;
}
if(re == i){
printf("%d\n",i);
}
}
}
}
8~10行,判断有没有超范围(其实只有一千万的范围)