zoukankan      html  css  js  c++  java
  • P1217 [USACO1.5]回文质数 Prime Palindromes(求100000000内的回文素数)

    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。

    USACO Training Section 1.5

    产生长度为5的回文数:

    for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数

         for (d2 = 0; d2 <= 9; d2++) {
             for (d3 = 0; d3 <= 9; d3++) {
               palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
             }
         }
     }

    分析

    求回文素数,如果枚举所有的数,会很浪费时间,所以可以先构造出回文数,然后判断是不是素数即可,

    • 除11不存在偶数位的回文数是素数,因为该回文数能被11整除,也就说明大于11的满足条件的回文数是奇数位,以中间数为对称轴。
    • 因大于2的素数都是奇数,故在奇数位回文数中,首位为2、4、6、8的数均不是素数。首位是它们,根据回文数的性质,末尾也是他们。
    • 因5的任何倍数末尾为5,故在奇数位回文数中,首位为5的数均不是素数。

    满足以上条件,制造回文数。

    因为回文数呈现对称,所以构造时做多5位(一共99999个数),减去偶数一半,还剩不到5万个,剩下的数中首位为0、2、4、5、6、8的数均不满足条件,回文数最多为2W个。

    构造出回文数后,在判断是否满足素数。

    code

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 
     7 int l,r,now = 2;
     8 
     9 int Creatpalindrome(int n)//构造回文数 
    10 {
    11     if (n<10)//小于10的会问素数只有2,3,5,7,两位的只有11 
    12     {
    13         switch(n)
    14         {
    15             case 2:now=3;return 2;//now递进的,下一次调用函数时就会进行下一条语句 
    16             case 3:now=5;return 3;
    17             case 5:now=7;return 5;
    18             case 7:now=9;return 7;
    19             case 9:now=10;return 11;
    20         }
    21     }
    22     
    23     int wn = (int)(log(n*1.0)/log(10*1.0));//位数-1,以中间位对称轴 
    24     int gn = n/(int)(pow(10*1.0,wn));//最高位是什么 
    25     int ret = 0;
    26     //最高位2,4,6,8,5都不满足条件,但它们+1就满足,所以它们的最高位+1 
    27     switch (gn)
    28     {
    29         case 2:
    30         case 4:
    31         case 6:
    32         case 8:
    33             now = (gn+1)*(int)pow(10*1.0,wn);//最高位+1后的数 
    34             ret = now*(int)pow(10*1.0,wn)+(gn+1);//最后一位数要和最高位一样 
    35             ++now;
    36             return ret;
    37         case 5:
    38             now = 7*(int)pow(10*1.0,wn);//最高位是5就将它变成7 
    39             ret = now*(int)pow(10*1.0,wn)+7;
    40             ++now;
    41             return ret;
    42     }
    43     //最高位满足条件 
    44     int sumn = 0;
    45     //记录n的前n-1位逆序和,比如12345的逆序和为4321,所以n 
    46     ret = n*(int)pow(10*1.0,wn);
    47     n /= 10;
    48     
    49     while (n)
    50     {
    51         sumn = sumn*10+n%10;
    52         n /= 10;
    53     }
    54     ++now;
    55     return ret+sumn;    
    56 }
    57 bool Isprime(int x)
    58 {
    59     for (int i=3; i*i<=x; i+=2)
    60     {
    61         if (x%i==0)
    62         return false ;
    63     }
    64     return true;
    65 }
    66 int main()
    67 {
    68     cin>>l>>r;
    69     for (int i=l; i<=r; )
    70     {
    71         i = Creatpalindrome(now);
    72         if (i>=l&&i<=r&&Isprime(i))
    73         {
    74             cout<<i<<endl;
    75         }
    76     }
    77     return 0;
    78 }

    参考博客http://blog.csdn.net/arvonzhang/article/details/8565515

  • 相关阅读:
    Oracle 查看一个表对应的主键和外键的约束关系,查看的语句:
    openssl 生成p12文件错误
    XP SP3远程桌面无法连接Windows Server 2008/Vista
    windows 7 正确禁用 IPv6
    用正则表达式替换换行符
    Eclipse插件开发之定制向导(各方法说明)
    oepnvpn 配置自启动
    TNS12547: TNS:lost contact 错误解决
    redhat 5.5 U盘安装
    Hibernat 使用Criteria查询多对多关系(SET集合)条件
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7306657.html
Copyright © 2011-2022 走看看