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;
}

更多內容大家可以訪問我的個人博客:一只大大怪


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM