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;
    }
  • 相关阅读:
    Hive的安装和建表
    在MarkDown中插入数学公式对照表(持续更新)
    Beta版本冲刺总汇
    a版本十日冲刺总汇
    “我们只是信息的搬运工”
    调查报告
    Beta版本冲刺第七天
    Beta版本冲刺第六天
    Beta版本冲刺第五天
    Beta版本冲刺第四天
  • 原文地址:https://www.cnblogs.com/kannyi/p/9501134.html
Copyright © 2011-2022 走看看