zoukankan      html  css  js  c++  java
  • 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;//(处理回文数...)
             }
         }
     }
    

    题目大意及分析

    1. 本题有上限为100,000,000,所以这道题可以用打表程序解决。值得一说的是,在比赛中或者只判定程序结果的考试当中,打表法无疑是简单粗暴的一种办法,但是在面试中,这种办法不可取。

    2. 我采用的是枚举法,并没有像提示中那样先构造回文数然后判断是否为质数(没看提示,直接开撸)。一遍程序发现TLE了。后来观察所得的回文质数有以下特点:

      这个数必然不是偶数;

      这个数的最高位也不是偶数;

      这样就减少了大量的循环量。

    代码

    #include<stdio.h>
    #include<math.h>
    int rev(int x)//反转这个数,如果与原数相等则是回文数;
    {
        int new_x=0;
        while(x)
        {
            new_x = x%10+new_x*10;
            x=x/10;
        }
        return new_x;
    }
    bool isprime(int x)//判断素数函数;
    {
        for(int m=2;m<=sqrt(x);m++)
        {
            if(x%m==0)
                return false;
        }
        return true;
    }
    int wei(int x)//判断这个数的位数;
    {
        if(10<x&&x<100) return 10;
        if(100<x&&x<1000) return 100;
        if(1000<x&&x<10000) return 1000;
        if(10000<x&&x<100000) return 10000;
        if(100000<x&&x<1000000) return 100000;
        if(1000000<x&&x<10000000) return 1000000;
        if(10000000<x&&x<100000000) return 10000000;
        return 1;
    }
    int main()
    {
        int a,b;
        scanf("%d%d",&a,&b);//比cin快;
        if(b>9989899) b=9989899;
        if(a%2==0) a+=1;
        for(int i=a;i<=b;i+=2)//循环,只选择其中奇数;
        {
            int n = wei(i);
            if(i/n%2==0) i+=n;
            if(rev(i)==i)
            {
                if(isprime(i))
                    printf("%d\n",i);//比cout快;
            }
        }
        return 0;
    }
    

    更多内容大家可以访问我的个人博客:一只大大怪

  • 相关阅读:
    DevExpress應用皮膚
    .net组件开发DesignerSerializationVisibility
    使用LINQ实现分组统计
    WIN7打开任何快捷方式都安全警告
    WinMount是一款国产免费且功能强大Windows小工具,具备压缩解压和虚拟光驱(CD/DVD)的双重功能
    AForge.NET Framework
    繼承DevExpress.XtraGrid.GridControl參考
    系统找不到指定的路径”和“找不到preview.msi旧版本卸载失败”的解决办法
    GRIDVIEW設置滾動條
    C# 3.0新特征之创建和初始化集合对象
  • 原文地址:https://www.cnblogs.com/cydi/p/11387667.html
Copyright © 2011-2022 走看看