📌  相关文章
📜  国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 77(1)

📅  最后修改于: 2023-12-03 15:37:15.853000             🧑  作者: Mango

国际空间研究组织 | ISRO CS 2017 – 5 月 |问题 77

问题描述

在一个数组中找到所有的颠倒素数,颠倒素数是指将一个素数的数字顺序颠倒所得到的数字仍为素数。例如,17和71都是颠倒素数。

函数签名
def is_reverse_prime(num: int) -> bool:
    pass

def reverse_primes(lst: List[int]) -> List[int]:
    pass
输入
  • lst
    • 类型:List[int]
    • 长度:$2 \leq len(lst) \leq 10^5$
    • 描述:输入的数组中的元素均为正整数
输出
  • 类型:List[int]
  • 描述:返回所有的颠倒素数,如果没有颠倒素数,返回空列表
示例
assert reverse_primes([13, 17, 31, 37, 71, 73]) == [13, 17, 31, 37, 71, 73]
assert reverse_primes([80, 104, 190]) == []
解题思路

这道题要找到所有的颠倒素数,首先需要知道素数是什么,然后需要知道怎么判断一个数字是否为素数,并且还需要知道怎么将一个数字中的数字顺序颠倒。

素数

素数是指在大于 1 的自然数中,除 1 和该数能被整除外,无法被其他自然数整除的数。

所以,对于一个大于 1 的自然数,如果其能够被 $2 \sim \sqrt{n}$ 中的任意一个数整除,则说明该数不是素数。

根据以上思路,我们来考虑如何编写一个函数来判断一个数是否为素数:

def is_prime(n: int) -> bool:
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True
颠倒数字

颠倒数字可以考虑将数字转换为字符串,然后再翻转字符串:

def reverse_number(n: int) -> int:
    return int(str(n)[::-1])
判断颠倒素数

判断一个数是否为颠倒素数就需要分别判断这个数和它的颠倒数是否都是素数:

def is_reverse_prime(num: int) -> bool:
    return is_prime(num) and is_prime(reverse_number(num))
找到所有颠倒素数

只需要对输入的列表中的每一个数调用 is_reverse_prime() 函数,如果是颠倒素数,则将其放入结果集合中即可:

from typing import List

def reverse_primes(lst: List[int]) -> List[int]:
    res = []
    for num in lst:
        if is_reverse_prime(num):
            res.append(num)
    return res
完整代码
from typing import List

def is_prime(n: int) -> bool:
    if n <= 1:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def reverse_number(n: int) -> int:
    return int(str(n)[::-1])

def is_reverse_prime(num: int) -> bool:
    return is_prime(num) and is_prime(reverse_number(num))

def reverse_primes(lst: List[int]) -> List[int]:
    res = []
    for num in lst:
        if is_reverse_prime(num):
            res.append(num)
    return res