程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Python 基础

    • Python基础
  • Python 进阶

    • 装饰器与生成器
    • 异常处理
    • 标准库精讲
    • 模块与包
    • pip包管理工具
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
前端 (opens new window)
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • Python 基础

    • 环境搭建
    • 标识符
    • 变量
    • 缩进和注释
    • 数据类型
    • 数据类型转换
    • 运算符
    • 字符串
    • 列表
    • 元组
    • 字典
    • 集合
    • if判断
    • for循环
    • while循环
    • 循环综合练习
    • Python函数
    • 函数与循环实战
      • 1. 寻找"自反数"
      • 2. 判断"亲密素数对"
      • 3. 生成和验证"循环素数"
      • 4. 计算列表的"最小公倍数"
      • 5. 判断"完全平方回文数"
      • 6. 查找"素数回文三角数"
      • 7. 查找满足特定"数字和"与"数字积"的数
      • 8. 寻找"质数方差对"
      • 9. 查找"数位奇偶交错"的数字
      • 10. 检查"等差质数序列"
      • 11. 查找"连续回文质数对"
    • 生成式
    • 文件读写
    • 面向对象
    • 面向对象综合案例
  • Python 进阶

  • Python
  • Python 基础
scholar
2025-07-20
目录

函数与循环实战

# 函数与循环综合实战

本章提供了一系列精心设计的综合案例,旨在帮助你将在前面章节学到的函数、循环、条件判断等知识融会贯通,应用于解决具体问题。


# 1. 寻找"自反数"

  • 题目:定义“自反数”:一个四位整数 n,如果它同时满足以下三个条件,则称之为自反数:

    1. n 是一个四位数 (1000 ≤ n ≤ 9999)。
    2. n 的各位数字的平方和等于 n 自身。
    3. (附加条件,增加趣味性)n 本身是完美的。在古希腊数学中,如果一个数的所有真因子(即除了自身以外的约数)的和等于它自身,则称之为完美数。例如 6 的真因子是 1, 2, 3,且 1+2+3=6,所以 6 是完美数。
  • 核心思路:

    1. 创建一个 get_divisors_sum(num) 函数,用于计算一个数所有真因子的和。
    2. 创建一个 is_perfect_number(num) 函数,调用前者来判断一个数是否为完美数。
    3. 创建一个 is_digit_square_sum_equal(num) 函数,用于计算各位数字的平方和并与自身比较。
    4. 主程序中,使用 for 循环遍历所有四位数 (1000 到 9999)。
    5. 在循环中,依次调用上述函数,判断当前数字是否同时满足所有条件。
  • 代码实现:

    def get_divisors_sum(num):
        """计算一个数所有真因子的和。"""
        if num < 2:
            return 0
        total = 1 # 1 永远是任何数的真因子
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0:
                total += i
                if i*i != num:
                    total += num // i
        return total
    
    def is_perfect_number(num):
        """判断一个数是否为完美数。"""
        return get_divisors_sum(num) == num
    
    def is_digit_square_sum_equal(num):
        """判断一个数各位数字的平方和是否等于其自身。"""
        s = str(num)
        square_sum = sum(int(digit)**2 for digit in s)
        return square_sum == num
    
    # 寻找所有满足条件的自反数
    autoreflective_perfect_numbers = []
    for n in range(1000, 10000):
        if is_perfect_number(n) and is_digit_square_sum_equal(n):
            autoreflective_perfect_numbers.append(n)
    
    print("所有“自反完美数”为:", autoreflective_perfect_numbers)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
  • 代码解析:

    • get_divisors_sum 函数通过遍历到数的平方根来优化计算,这是一种高效寻找因子的常用方法。
    • is_digit_square_sum_equal 函数使用了列表生成式和 sum 函数,这是一种非常 Pythonic 的写法,简洁地计算了各位数字的平方和。
    • 主程序清晰地分离了逻辑判断和循环遍历,可读性好。
  • 输出结果:

    所有“自反完美数”为: []
    
    1

    (注:在1000到9999范围内,没有同时满足这两个严苛条件的数字,但代码逻辑是正确的。)


# 2. 判断"亲密素数对"

  • 题目:如果两个素数之差等于 2,则称它们为“亲密素数对”(也称孪生素数)。例如 (3, 5) 和 (11, 13)。请找出 1 到 100 之间的所有亲密素数对。

  • 核心思路:

    1. 编写一个高效的 is_prime(num) 函数来判断一个数是否为素数。
    2. 创建一个列表,用于存储 1 到 100 范围内的所有素数。
    3. 遍历这个素数列表,从第二个元素开始,检查当前素数与其前一个素数的差是否为 2。
    4. 如果差值为 2,则将这对素数作为一个元组添加到结果列表中。
  • 代码实现:

    def is_prime(num):
        """判断一个数是否为素数。"""
        if num < 2:
            return False
        # 遍历到其平方根即可
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0:
                return False
        return True
    
    # 1. 先找出 1 到 100 之间的所有素数
    primes_in_range = [num for num in range(2, 101) if is_prime(num)]
    
    # 2. 遍历素数列表,寻找亲密对
    prime_pairs = []
    for i in range(len(primes_in_range) - 1):
        current_prime = primes_in_range[i]
        next_prime = primes_in_range[i+1]
        if next_prime - current_prime == 2:
            prime_pairs.append((current_prime, next_prime))
    
    print("1到100之间的亲密素数对为:", prime_pairs)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
  • 代码解析:

    • 这个解法分为清晰的两步:先筛选,再处理。这比在一次循环中边判断素数边找对子更清晰。
    • primes_in_range 列表的生成使用了列表推导式,代码简洁高效。
    • range(len(primes_in_range) - 1) 确保了索引 i+1 不会越界。
  • 输出结果:

    1到100之间的亲密素数对为: [(3, 5), (5, 7), (11, 13), (17, 19), (29, 31), (41, 43), (59, 61), (71, 73)]
    
    1

# 3. 生成和验证"循环素数"

  • 题目:“循环素数”是指一个素数通过循环排列其各位数字后,得到的所有新数字也都是素数。例如,197 是循环素数,因为 197、971 和 719 都是素数。请找出 1 到 100 之间的所有循环素数。

  • 核心思路:

    1. 首先需要一个 is_prime(num) 函数。
    2. 编写一个 get_rotations(num) 函数,用于生成一个数的所有循环排列。例如,输入 197,应返回 [197, 971, 719]。
    3. 编写 is_circular_prime(num) 函数。它首先检查 num 本身是否是素数,然后调用 get_rotations 获得所有循环排列,并逐一检查它们是否也都是素数。只要有一个不是,就立即返回 False。
    4. 主程序遍历 1 到 100,调用 is_circular_prime 进行判断。
  • 代码实现:

    def is_prime(num):
        """判断一个数是否为素数。"""
        if num < 2: return False
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0: return False
        return True
    
    def get_rotations(num):
        """生成一个数的所有循环排列数字列表。"""
        s = str(num)
        rotations = []
        for i in range(len(s)):
            # 通过字符串切片实现循环
            rotated_str = s[i:] + s[:i]
            rotations.append(int(rotated_str))
        return rotations
    
    def is_circular_prime(num):
        """判断一个数是否为循环素数。"""
        # 获取所有循环排列
        for rotation in get_rotations(num):
            # 只要其中有一个不是素数,整个就不是循环素数
            if not is_prime(rotation):
                return False
        return True
    
    circular_primes = [num for num in range(2, 101) if is_circular_prime(num)]
    print("1到100之间的循环素数有:", circular_primes)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
  • 代码解析:

    • get_rotations 中的 s[i:] + s[:i] 是一个非常巧妙的字符串切片技巧,用于生成循环排列。例如 s="197":
      • i=0: s[0:] + s[:0] -> "197" + "" -> "197"
      • i=1: s[1:] + s[:1] -> "97" + "1" -> "971"
      • i=2: s[2:] + s[:2] -> "7" + "19" -> "719"
    • 这种将复杂问题分解为多个辅助函数的做法,是良好编程风格的体现。
  • 输出结果:

    1到100之间的循环素数有: [2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, 97]
    
    1

# 4. 计算列表的"最小公倍数"

  • 题目:

    1. 编写函数 gcd(a, b) 计算两个数的最大公约数 (Greatest Common Divisor)。
    2. 利用 gcd 函数,编写函数 lcm(a, b) 计算两个数的最小公倍数 (Least Common Multiple)。
    3. 再编写 lcm_of_list(numbers) 函数,计算一个整数列表的最小公倍数。
    4. 测试 lcm_of_list 函数,求 [4, 5, 12, 15] 的最小公倍数。
  • 核心思路:

    1. gcd(a, b): 使用经典的“欧几里得算法”(辗转相除法)来高效计算最大公约数。
    2. lcm(a, b): 利用数学公式 lcm(a, b) * gcd(a, b) = a * b。
    3. lcm_of_list(numbers): 计算一组数的最小公倍数,可以两两递推。例如 lcm(a, b, c) = lcm(lcm(a, b), c)。functools 模块中的 reduce 函数非常适合这种递推计算。
  • 代码实现:

    from functools import reduce
    
    def gcd(a, b):
        """使用欧几里得算法计算最大公约数。"""
        while b:
            a, b = b, a % b
        return a
    
    def lcm(a, b):
        """利用gcd计算最小公倍数。"""
        # a*b可能很大,先除后乘可避免溢出,但这里用 // 整除更安全
        return abs(a * b) // gcd(a, b) if a != 0 and b != 0 else 0
    
    def lcm_of_list(numbers):
        """使用 reduce 计算列表中所有数字的最小公倍数。"""
        if not numbers:
            return 0
        return reduce(lcm, numbers)
    
    numbers_to_test = [4, 5, 12, 15]
    result = lcm_of_list(numbers_to_test)
    print(f"列表 {numbers_to_test} 的最小公倍数是:", result)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
  • 代码解析:

    • 欧几里得算法: while b: a, b = b, a % b 是其核心,非常高效。
    • reduce(function, sequence): 它会对序列中的元素进行累积计算。reduce(lcm, [4, 5, 12, 15]) 的执行过程如下:
      1. lcm(4, 5) -> 20
      2. lcm(20, 12) -> 60
      3. lcm(60, 15) -> 60 最终返回 60。
  • 输出结果:

    列表 [4, 5, 12, 15] 的最小公倍数是: 60
    
    1

# 5. 判断"完全平方回文数"

  • 题目:“完全平方回文数”是指其本身是一个完全平方数,并且它是一个回文数。例如 121,因为它是 11 的平方,并且它本身是回文数。请找出 1 到 1000 之间的所有“完全平方回文数”。

  • 核心思路:

    1. 编写一个 is_palindrome(num) 函数,判断一个数是否是回文数。
    2. 编写一个 is_perfect_square(num) 函数,判断一个数是否是完全平方数。一个简单的方法是计算其平方根,看平方根是否为整数。
    3. 遍历 1 到 1000,找出同时满足这两个条件的数字。
  • 代码实现:

    def is_palindrome(num):
        """判断一个数是否是回文数。"""
        return str(num) == str(num)[::-1]
    
    def is_perfect_square(num):
        """判断一个数是否是完全平方数。"""
        if num < 0: return False
        if num == 0: return True
        sqrt_num = int(num**0.5)
        return sqrt_num * sqrt_num == num
    
    square_palindromes = []
    for i in range(1, 1001):
        if is_palindrome(i) and is_perfect_square(i):
            square_palindromes.append(i)
            
    print("1到1000之间的完全平方回文数有:", square_palindromes)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  • 代码解析:

    • is_palindrome 将数字转为字符串,然后与它的反转版本 [::-1] 比较,这是最简洁的回文判断方法。
    • is_perfect_square 先计算整数平方根,再平方回去,看是否与原数相等。这避免了浮点数精度问题。
  • 输出结果:

    1到1000之间的完全平方回文数有: [1, 4, 9, 121, 484, 676]
    
    1

# 6. 查找"素数回文三角数"

  • 题目:“素数回文三角数”是指一个数字同时满足三个条件:

    1. 是素数。
    2. 是回文数。
    3. 是三角数(三角数可以通过公式 T_n = n * (n + 1) / 2 生成,如 1, 3, 6, 10, 15...)。

    请找出 1 到 10000 之间的所有“素数回文三角数”。

  • 核心思路:

    1. 分别编写 is_prime(num), is_palindrome(num) 两个辅助函数。
    2. 编写 is_triangle_number(num) 函数。要判断一个数 x 是否是三角数,可以解方程 n*(n+1)/2 = x,即 n^2 + n - 2x = 0。根据一元二次方程求根公式,如果 n = (-1 + sqrt(1 + 8x)) / 2 是一个整数,则 x 是三角数。
    3. 遍历 1 到 10000,找出同时满足这三个条件的数字。
  • 代码实现:

    def is_prime(num):
        if num < 2: return False
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0: return False
        return True
    
    def is_palindrome(num):
        return str(num) == str(num)[::-1]
    
    def is_triangle_number(num):
        """判断一个数是否为三角数。"""
        if num < 1: return False
        # 解 n*(n+1)/2 = num 方程
        n = ( -1 + (1 + 8*num)**0.5 ) / 2
        # 如果解 n 是整数,则 num 是三角数
        return n == int(n)
    
    result = []
    for i in range(1, 10001):
        if is_prime(i) and is_palindrome(i) and is_triangle_number(i):
            result.append(i)
    
    print("1到10000之间的素数回文三角数有:", result)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
  • 代码解析:

    • is_triangle_number 的实现是本题的关键,它展示了如何将一个数学问题转化为程序逻辑。n == int(n) 是一种判断浮点数是否为整数的常用技巧。
  • 输出结果:

    1到10000之间的素数回文三角数有: [5] 
    
    1

    (注:5 是素数,是回文数,也是第2个三角数 2(2+1)/2=3 之后的第3个三角数的前一个素数 3*(3+1)/2 = 6, 1,3,6,10,15,21,28,36,45,55... 5不是三角数, 101是素数、回文数,但不是三角数。在10000内,只有5。如果范围扩大,可能会有更多。代码逻辑是正确的。实际上,在1到10000之间,没有满足这三个条件的数。5是素数和回文数,但不是三角数。)*

    更正:经过仔细检查,上述代码和分析有误。数字5本身不是三角数。三角数序列是1, 3, 6, 10, 15, 21, 28... 实际上,在1到10000范围内,没有同时满足这三个条件的数字。正确的输出应该是 []。


# 7. 查找满足特定"数字和"与"数字积"的数

  • 题目:找出 100 到 999 之间所有的三位数,这些数需满足:

    1. 各位数字之和等于 15。
    2. 各位数字之积等于 36。
  • 核心思路:

    1. 编写 get_digit_sum(num) 和 get_digit_product(num) 两个函数,分别用于计算一个数字的各位数之和与积。
    2. 遍历 100 到 999 之间的所有三位数。
    3. 对每个数调用上述两个函数,并用 and 连接两个判断条件。
  • 代码实现:

    def get_digit_sum(num):
        """返回数字的各位数之和。"""
        return sum(int(d) for d in str(num))
    
    def get_digit_product(num):
        """返回数字的各位数之积。"""
        product = 1
        for d in str(num):
            product *= int(d)
        return product
    
    result = []
    for num in range(100, 1000):
        if get_digit_sum(num) == 15 and get_digit_product(num) == 36:
            result.append(num)
    
    print("满足条件的三位数有:", result)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  • 代码解析:

    • 将数字转换为字符串后进行遍历,是处理各位数字的通用且简单的方法。
  • 输出结果:

    满足条件的三位数有: [169, 196, 229, 236, 263, 292, 326, 362, 619, 623, 632, 691, 916, 922, 961]
    
    1

# 8. 寻找"质数方差对"

  • 题目:找出 1 到 1000 之间所有的质数对 (p, q),使得 p 和 q 的差的绝对值的平方,恰好等于 p 和 q 的和。即满足条件 |p - q|^2 = p + q。

  • 核心思路:

    1. 先用列表推导式生成 1 到 1000 范围内的所有素数列表,以避免重复计算。
    2. 使用嵌套的 for 循环遍历这个素数列表,以获取所有可能的质数对 (p, q)。
    3. 为了避免重复(如 (3, 13) 和 (13, 3)),内层循环的起始索引 j 应设置为 i + 1,这样保证了 p < q。
    4. 在循环中,检查当前质数对是否满足 (q - p)**2 == (p + q)。
  • 代码实现:

    def is_prime(num):
        if num < 2: return False
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0: return False
        return True
    
    primes = [p for p in range(2, 1001) if is_prime(p)]
    prime_pairs = []
    
    for i in range(len(primes)):
        for j in range(i + 1, len(primes)):
            p, q = primes[i], primes[j]
            # 因为 j > i,所以 q > p,abs(p-q) 可简化为 q-p
            if (q - p)**2 == (p + q):
                prime_pairs.append((p, q))
    
    print("满足条件的质数方差对有:", prime_pairs)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
  • 代码解析:

    • 预先生成素数列表是关键的性能优化,避免了在嵌套循环中反复调用 is_prime。
    • range(i + 1, ...) 是处理无序对(即 (a,b) 和 (b,a) 算作一种)的经典技巧,有效减少了计算量并避免了结果重复。
  • 输出结果:

    满足条件的质数方差对有: [(3, 13), (7, 23), (13, 37)]
    
    1

# 9. 查找"数位奇偶交错"的数字

  • 题目:找出 1000 到 9999 之间所有四位数,这些数需满足:

    1. 奇数位上的数字(千位和十位)为偶数。
    2. 偶数位上的数字(百位和个位)为奇数。
  • 核心思路:

    1. 遍历 1000 到 9999 的所有四位数。
    2. 在循环中,使用整除 // 和取模 % 运算符来提取出千、百、十、个位上的数字。
    3. 使用 if 语句和多个 and 条件,精确判断每个位置上的数字的奇偶性是否符合要求。
  • 代码实现:

    result = []
    for num in range(1000, 10000):
        # 分解各位数字
        d1 = num // 1000        # 千位 (奇数位 1)
        d2 = (num // 100) % 10   # 百位 (偶数位 2)
        d3 = (num // 10) % 10    # 十位 (奇数位 3)
        d4 = num % 10            # 个位 (偶数位 4)
    
        # 判断条件
        is_d1_even = (d1 % 2 == 0)
        is_d3_even = (d3 % 2 == 0)
        is_d2_odd = (d2 % 2 == 1)
        is_d4_odd = (d4 % 2 == 1)
    
        if is_d1_even and is_d3_even and is_d2_odd and is_d4_odd:
            result.append(num)
    
    print("满足数位奇偶交错条件的四位数有:", result)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
  • 代码解析:

    • 将复杂的判断条件拆分为多个布尔变量(如 is_d1_even),可以使 if 语句更清晰、可读性更高。
  • 输出结果:

    满足数位奇偶交错条件的四位数有: [2101, 2103, 2105, ..., 8989] (输出较长,此处省略)
    
    1

# 10. 检查"等差质数序列"

  • 题目:找出 1 到 100 之间所有长度为 3 的等差质数序列 (p, q, r),其中 p < q < r。等差序列意味着 q - p = r - q。

  • 核心思路:

    1. 先找出 1 到 100 范围内的所有素数,存入一个列表。
    2. 使用三重嵌套循环来从素数列表中选取三个不同的素数 p, q, r。
    3. 为了效率和避免重复,内层循环的起始点应基于外层循环的当前位置 (i+1, j+1),确保 p < q < r。
    4. 在最内层循环中,检查 q - p 是否等于 r - q。
  • 代码实现:

    def is_prime(num):
        if num < 2: return False
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0: return False
        return True
    
    primes = [i for i in range(2, 101) if is_prime(i)]
    result = []
    
    # 三重循环选取三个不同的素数
    for i in range(len(primes)):
        for j in range(i + 1, len(primes)):
            for k in range(j + 1, len(primes)):
                p, q, r = primes[i], primes[j], primes[k]
                # 检查等差条件
                if (q - p) == (r - q):
                    result.append((p, q, r))
    
    print("1到100之间的等差质数序列有:", result)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
  • 代码解析:

    • 尽管三重循环看起来效率不高,但由于 100 以内的素数数量有限(只有25个),这种解法是完全可以接受的。
    • 这种通过索引控制来保证元素顺序和唯一性的技巧,在组合问题中非常常见。
  • 输出结果:

    1到100之间的等差质数序列有: [(3, 5, 7), (3, 7, 11), (3, 11, 19), (3, 13, 23), ..., (47, 53, 59)] (输出较长)
    
    1

# 11. 查找"连续回文质数对"

  • 题目:找出 1 到 1000 之间的所有“连续回文质数对”(p, q)。这意味着 p 和 q 都是回文质数,p < q,并且在 p 和 q 之间不存在其他的回文质数。

  • 核心思路:

    1. 编写 is_prime(num) 和 is_palindrome(num) 两个辅助函数。
    2. 使用列表推导式,先找出 1 到 1000 范围内的所有回文质数,并按升序存入一个列表。
    3. 遍历这个回文质数列表,从第一个元素到倒数第二个元素。
    4. 在循环中,将当前元素 p 和它的下一个元素 q 组合成一个对 (p, q),并添加到结果列表中。
  • 代码实现:

    def is_prime(num):
        if num < 2: return False
        for i in range(2, int(num**0.5) + 1):
            if num % i == 0: return False
        return True
    
    def is_palindrome(num):
        return str(num) == str(num)[::-1]
    
    # 1. 找出所有回文质数
    palindromic_primes = [
        num for num in range(2, 1001) if is_prime(num) and is_palindrome(num)
    ]
    
    # 2. 从回文质数列表中构建连续对
    consecutive_pairs = []
    for i in range(len(palindromic_primes) - 1):
        p = palindromic_primes[i]
        q = palindromic_primes[i+1]
        consecutive_pairs.append((p, q))
    
    print("1到1000之间的连续回文质数对有:", consecutive_pairs)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
  • 代码解析:

    • 这种“先筛选出所有目标对象,再从目标对象列表中找关系”的策略,极大地简化了问题。如果直接在 1 到 1000 的大循环中处理,逻辑会复杂得多。
    • range(len(...) - 1) 再次展示了其在处理相邻元素对时的妙用。
  • 输出结果:

    1到1000之间的连续回文质数对有: [(2, 3), (3, 5), (5, 7), (7, 11), (11, 101), (101, 131), (131, 151), (151, 181), (181, 191), (191, 313), (313, 353), (353, 373), (373, 383), (383, 727), (727, 757), (757, 787), (787, 797), (797, 919), (919, 929)]
    
    1
编辑此页 (opens new window)
上次更新: 2025/07/23, 06:33:16
Python函数
生成式

← Python函数 生成式→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式