USACO-Section1.5 Prime Palindromes[其他]

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值