zoukankan      html  css  js  c++  java
  • 算法竞赛模板 回文素数

    求a~b之间所有回文素数的方法

    先创造出a~b之间的所有回文数,再依次判断是否为素数。

    ps:若先找素数再判断回文数会超时!

    #include<bits/stdc++.h>
    using namespace std;
    int lena,lenb,a,b,num[10];
    //获取数的位数
    int getlen(int n)
    {
        int len=0;
        while(n)
        {
            n/=10;
            len++;
        }
        return len;
    }
    //判断素数
    int jud(int n)
    {
        if(n<a||n>b)return 0;
        for(int i=2;i*i<=n;i++)
            if(n%i==0)return 0;
        return 1;
    }
    //幂函数
    int p(int a,int n)
    {
        int i,sum=1;
        for(i=1;i<=n;i++)sum*=a;
        return sum;
    }
    //获取字符串的值
    int getval(int len)
    {
        int sum=0,i;
        for(i=1;i<=len;i++)
            sum+=num[i]*p(10,i-1);
        return sum;
    }
    //位数为len的回文数构造
    void creat(int len,int pos)
    {
        int i,t,hlen=(1+len)/2;
        for(i=0;i<10;i++)
        {
            if(!i&&pos==1)continue;
            num[pos]=num[len+1-pos]=i;
            if(pos<hlen)
            {
                pos++;
                creat(len,pos);
                pos--;
            }
            else
            {
                t=getval(len);
                if(jud(t))printf("%d
    ",t);
            }
        }
    }
    void ok(int lena)
    {
        int i;
        memset(num,0,sizeof(num));
        for(i=lena;i<=lenb;i++)
            creat(i,1);
    }
    int main()
    {
        scanf("%d%d",&a,&b);
        lena=getlen(a);
        lenb=getlen(b);
        ok(lena);
        return 0;
    }
  • 相关阅读:
    UOJ299 游戏
    SPOJ-DivCnt2 Counting Divisors (square)
    Gym102331B Bitwise Xor
    POJ3495 Bitwise XOR of Arithmetic Progression
    LG5325 【模板】Min_25筛
    LOJ6229 这是一道简单的数学题
    BZOJ3601 一个人的数论
    LOJ138 类欧几里得算法
    Atcoder TypicalDPContest N~T
    莫队基础题
  • 原文地址:https://www.cnblogs.com/kannyi/p/9501134.html
Copyright © 2011-2022 走看看