2017-5-30
题目
输入两个数表示上限下限,在此范围内输出所有既是素数又是回文数的数。
题解
看起来很简单,但是最大范围是一亿。限定时间是一秒,所以枚举每一个数字分别进行判断的方法超时。而且限定空间,开个一千万的数组都不行,也就不能使用素数表。所以很惭愧,看了一些别人的题解,最后使用了构造回文数然后判断素数的方法。(不会算复杂度,但是最后耗时很小)
代码
/*
ID: xcwhkh1
LANG: C++
TASK: pprime
*/
#include <cstdio>
int num[20];
int begin,end;
bool isprime(int x){
if(x%2==0) return 0;
for (int i=3;i*i<=x;i+=2) if(x%i==0) return 0;
return 1;
}
int Modify(int x){//由12345生成123454321
int t=x;x/=10;//偶数位数的回文数被11整除
while (x>0){
t=t*10+x%10;
x/=10;
}
return t;
}
int main(){
freopen("pprime.in","r",stdin);
freopen("pprime.out","w",stdout);
int i,j,k;
scanf("%d%d",&begin,&end);
if(begin<=5&&5<=end) printf("5\n");
if(begin<=7&&7<=end) printf("7\n");
if(begin<=11&&11<=end) printf("11\n");
i=10;
while (Modify(i)<begin) i++;
while (Modify(i)<=end)
{
k=i;j=1;
while (k>9) {k/=10;j*=10;}//k即是i的首数字,j为i的数量级
if(k%2==0) {i+=j;continue;}//如果i的首数字为偶数则首数字+1
j=Modify(i);//其实是由i来构造回文数
if(isprime(j))
printf("%d\n",j);
i++;
}
return 0;
}