• luogu P1217 [USACO1.5]回文质数 Prime Palindromes


     

    题目描述

    因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

    写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

    输入输出格式

    输入格式:

    第 1 行: 二个整数 a 和 b .

    输出格式:

    输出一个回文质数的列表,一行一个。

    输入输出样例

    输入样例#1:
    5 500
    
    输出样例#1:
    5
    7
    11
    101
    131
    151
    181
    191
    313
    353
    373
    383
    

    说明

    Hint 1: Generate the palindromes and see if they are prime.

    提示 1: 找出所有的回文数再判断它们是不是质数(素数).

    Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.

    提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

    题目翻译来自NOCOW。

    T掉一个点:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    
    using namespace std;
    
    int n,m;
    char s[15];
    bool vis[100000001];
    
    inline int read()
    {
        int x=0;char c=getchar();
        while(c<'0'||c>'9')c=getchar();
        while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
        return x;
    }
    
    void make()                   
    {
        vis[1]=1;  
        vis[0]=1;
        int q=(int)sqrt(m)+1;
        for (int i=2;i<=q;i++)
            if (!vis[i])
                for (int j=i*2;j<=m;j+=i)
                    vis[j]=1;
    }
    
    inline bool go_on(int x)
    {
        sprintf(s,"%d",x);
        int len=strlen(s);
        if(len==1)
            return 1;
        for(int i=0;i<len>>1-1;i++)
            if(s[i]!=s[len-i-1])
                return 0;
        return 1;
    }
    
    int main()
    {
        n=read();
        m=read();
        make();
        for(int i=n;i<=m;i++)
        {
            if(!vis[i]&&go_on(i))
                printf("%d
    ",i);
        }
        return 0;
    }
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    int main()
    {
        long a,b,d;
        bool palindrome(long);
        bool prime(long);
        scanf("%ld %ld",&a,&b);                //输入给定区间下限a(a≥5)和上限b(b≤100000000)
        a+=!(a%2);                            //给定区间内不可能存在偶质数
        b=b>9999999?9999999:b;                //给定区间内不可能存在八位数以上的回文质数
        for(d=a;d<=b;d+=2)
            if(palindrome(d) && prime(d))
                printf("%ld
    ",d);            //输出给定区间[a,b]内的所有回文质数
        return 0;
    }
    bool palindrome(long d)                    //该函数用于判断一个自然数d是否为回文数
    {
        char _d[10],j=0,k;
        sprintf(_d,"%ld",d);                //将d转换为字符串_d
        k=strlen(_d)-1;
        while(j<k)
            if(_d[j++]!=_d[k--])
                return false;
        return true;
    }
    bool prime(long p)                        //该函数用于判断一个大于1的自然数p是否为质数
    {
        int _p;
        for(_p=2;_p<=sqrt(p);_p++)
            if(!(p%_p))
                return false;
        return true;
    }
  • 相关阅读:
    理解区块链之前,先上手体验一把数字货币(2018-04-06 陈浩 第6讲)
    约瑟夫·卢宾《以太坊:从底层揭秘区块链应用和机会》2018-04-21
    以太坊智能合约介绍,Solidity介绍
    新浪微博 [异常问题] 414 Request-URL Too Large
    Google自动广告,将广告代码放置在 HTML 中的什么位置?
    囤币一族,被中国市场遗忘的价值币ADA
    基于EOS开发的Dapp大全
    朴素贝叶斯算法,贝叶斯分类算法,贝叶斯定理原理
    区块链3.0 ada Cardano卡尔达诺如何获得一致好评?
    拜占庭将军问题(Byzantine Generals Problem),一个关于分布式系统容错问题故事
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/7128312.html
Copyright © 2020-2023  润新知