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

题目描述

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

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

输入格式

第一行输入两个正整数 a a a b b b

输出格式

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

1.题目分析

该题考查的是质数的判断,回文数的判断,以及对时间复杂度的控制。
质数的判断直接遍历取余是否为0即可,
回文数的判断:首先肯定是奇数,数字的位数一定也是奇数:
题目要求的一亿以内,所以可以是1,3,5,7位。
使用循环嵌套乘上数量级可以得到相应的回文数。

2.题目思路

首先写一个判断质数的函数,为降低时间复杂度,遍历1亿以内的数会出现超时,
所以只对奇数,奇数位数的数进行判断,分别一个循环生成一位数的回文质数,两个循环生成三位数的回文质数,三个循环生成五位数的回文质数,四个循环生成七位数,到此已经达到了题目要求的一亿以内。
值得一提的是11,偶数中的回文质数,需要做一个特判。

3.代码演示

#include 
#include 

//判断是否为质数
int isPrime(int n) {
    int flag = 1;
    for (int i = 2; i <= sqrt(n); ++i) {
        if (n % i == 0) {
            flag = 0;
        }
    }
    return flag;
}

int main() {
    int d1, d2, d3, d4;
    int palindrome;
    int a, b;
    scanf("%d%d", &a, &b);
    //处理1位数 加上11
    //5到10
    for (d1 = 2; d1 <= 11; d1++) {
        palindrome = d1;//(处理回文数...)
        if (isPrime(palindrome) == 1 && palindrome >= a && palindrome <= b) {
            printf("%d\n", palindrome);
        }
    }
    //11到999
    //处理3位数
    for (d1 = 1; d1 <= 9; d1 += 2) {    // 只有奇数才会是素数
        for (d2 = 0; d2 <= 9; d2++) {
            palindrome = d1 * 100 + d2 * 10 + d1;//(处理回文数...)
            if (isPrime(palindrome) == 1 && palindrome >= a && palindrome <= b) {
                printf("%d\n", palindrome);
            }
        }
    }
    //1000到99999
    //处理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;//(处理回文数...)
                if (isPrime(palindrome) == 1 && palindrome >= a && palindrome <= b) {
                    printf("%d\n", palindrome);
                }
            }
        }
    }
    // 100000到9999999
    //处理7位数 千万
    for (d1 = 1; d1 <= 9; d1 += 2) {    // 只有奇数才会是素数
        for (d2 = 0; d2 <= 9; d2++) {
            for (d3 = 0; d3 <= 9; d3++) {
                for (d4 = 0; d4 <= 9; d4++) {
                    palindrome =
                            1000000 * d1 + 100000 * d2 + 10000 * d3 + 1000 * d4 + 100 * d3 + 10 * d2 + d1;//(处理回文数...)
                    if (isPrime(palindrome) == 1 && palindrome >= a && palindrome <= b) {
                        printf("%d\n", palindrome);
                    }
                }
            }
        }
    }
    
    return 0;
}

你可能感兴趣的:(刷题go,go,go,算法)