zuilp @ 2023-12-14 23:30:01
#include<stdio.h>
int sui(int n)
{
int i=0;
for(i=2;i<n;i++)
{
if(n%i==0)
return 0;//no
}
return 1;
}
int hui(int n,int s)
{
if(n==0)
return s;
s*=10;
s+=n%10;
n=n/10;
hui(n,s);
}
int wei(int n,int* p)
{
if(1000<n&&n<10000)
return 0;
if(100000<n&&n<1000000)
return 0;
return 1;
}
int min(int a,int b)
{
if(a>b)
return b;
else
return a;
}
int main()
{
int i,a,b;
scanf("%d %d",&a,&b);
if(a%2==0)
a++;
for(i=a;i<=min(b,9999999);i+=2)
{
if(wei(i,&i))
{
if(hui(i,0)==i)
{
if(sui(i))
printf("%d\n",i);
}
}
}
return 0;
}
by Mlzsan_HP @ 2023-12-16 16:30:04
我是先埃氏筛预处理再做 还挺快的
#include<bits/stdc++.h>
using namespace std;
bitset<100000001>z;
int zs[5000000],a,b,y,o,u;
int zx,zd;
int find(int l,int r,int k){
int m;
while(l+1<r){
m=(l+r)/2;
if(zs[m]<=k)l=m;
else r=m;
}
if(k-zs[l]<=zs[r]-k)return l;
else return r;
}
void write(int x){
if(x>9)write(x/10);
putchar(x%10+'0');
return;
}
int read(){
int x=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
int main(){
a=read(),b=read();
zs[1]=2,y=1;
for(int i(3);i<=b;i+=2){
if(z[i]==1)continue;
y++,zs[y]=i,o=i<<1;
for(int j(i+o);j<=b;j+=o)z[j]=1;
}
zx=find(1,y,a);zd=find(1,y,b);
for(int i(zx);i<=zd;i++){
o=zs[i],u=0;
while(o>0){
u*=10;
u+=o%10;
o/=10;
}
if(zs[i]==u)write(zs[i]),printf("\n");
}
return 0;
}
by Mlzsan_HP @ 2023-12-16 16:31:40
@zuilp
道路千万条 安全第一条 棕名不规范 亲人两行泪
by xrpo0 @ 2023-12-23 19:07:56
我也是写了额外2个函数,一个判断质数,一个判断是不是回文数。然后超时了。后面利用逻辑运算符短路特性,把判断回文数放在前面,任何923ms勉强过。