洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构

题目描述

因为 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(5≤a<b≤100,000,000)(一亿)间的所有回文质数。

输入格式

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

输出格式

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

输入输出样例

输入

复制代码
5 500

输出

复制代码
5
7
11
101
131
151
181
191
313
353
373
383

方式

代码

python 复制代码
class Solution:
    @staticmethod
    def oi_input():
        """从标准输入读取数据"""
        left, right = map(int, input().split())
        return left, right

    @staticmethod
    def oi_test():
        """提供测试数据"""
        return 5, 500

    @staticmethod
    def solution(left, right):
        def is_prime(n):
            '''试除法,优化版'''
            if n < 2:
                return False
            if n in (2, 3):
                return True
            if n % 2 == 0 or n % 3 == 0:
                return False
            i, w = 5, 2
            while i * i <= n:  # i 为除数 所以要不大于n的平方根
                if n % i == 0:
                    return False
                i += w
                w = 6 - w
            return True

        def generate_palindromes():
            '''回文数生成'''
            yield 5
            yield 7
            yield 11
            for length in [3, 5, 7]:
                k = (length + 1) // 2
                start, end = 10 ** (k - 1), 10 ** k  # 左 与 右
                for num in range(start, end):
                    s = str(num)
                    if s[0] not in {'1', '3', '7', '9'}:  # 判断最后一位
                        continue
                    prefix, suffix = s, s[:-1][::-1]  # 前半部分 与 去除了中间的后半部分
                    pal = int(prefix + suffix)
                    yield pal

        prime_nums = []
        for pal in generate_palindromes():
            if left <= pal <= right and is_prime(pal):
                prime_nums.append(pal)

        for p in prime_nums:
            print(p)


oi_input = Solution.oi_input
oi_test = Solution.oi_test
solution = Solution.solution

if __name__ == '__main__':
    left, right = oi_test()
    # left, right = oi_input()
    solution(left, right)

流程图

回文数生成器 是 否 是 否 是 否 否 是 生成5,7,11 生成回文数序列 循环处理长度3/5/7 计算半长k=(length+1)//2 确定前缀范围[start=10^(k-1), end=10^k) 遍历前缀数字生成回文 前缀首位是否在1,3,7,9中? 构造回文数:前缀+逆序后缀 开始 输入区间left, right 初始化prime_nums列表 检查回文数是否在区间内 left ≤ pal ≤ right? 执行质数检查 跳过该回文数 是质数? 添加到prime_nums列表 循环结束? 输出所有prime_nums元素 结束

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++