feat(euler_37.py):添加截断素数验证函数和性能计时器

♻️ refactor(euler_37.py):优化素数判断算法和代码结构
 test(euler_37.py):完善截断素数检测逻辑和主程序
This commit is contained in:
2026-01-07 18:33:01 +08:00
parent 09ddf3f65c
commit 5b1a9f0e4e

View File

@@ -9,10 +9,22 @@ Find the sum of the only eleven primes that are both truncatable from left to ri
NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes. NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes.
""" """
import time
from itertools import product from itertools import product
def combine_lists(a: list[int], b: list[int|None], c: list[int]) -> list[int]: def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Time taken: {end_time - start_time:.6f} seconds")
return result
return wrapper
def combine_lists(a: list[int], b: list[int | None], c: list[int]) -> list[int]:
"""将三个列表的每个元素组合成数字""" """将三个列表的每个元素组合成数字"""
return [int(f"{x}{y}{z}") for x, y, z in product(a, b, c)] return [int(f"{x}{y}{z}") for x, y, z in product(a, b, c)]
@@ -21,12 +33,32 @@ def is_prime(n: int) -> bool:
"""判断一个数是否为素数""" """判断一个数是否为素数"""
if n < 2: if n < 2:
return False return False
for i in range(2, int(n ** 0.5) + 1): for i in range(2, int(n**0.5) + 1):
if n % i == 0: if n % i == 0:
return False return False
return True return True
def truncate_left(n: int) -> bool:
"""从左到右截断一个数"""
length = len(str(n))
while n > 0:
if not is_prime(n):
return False
n %= 10 ** (length - 1)
length -= 1
return True
def truncate_right(n: int) -> bool:
"""从右到左截断一个数"""
while n > 0:
if not is_prime(n):
return False
n //= 10
return True
def TruncatablePrime() -> list[int]: def TruncatablePrime() -> list[int]:
begin = [2, 3, 5, 7] begin = [2, 3, 5, 7]
end = [3, 7] end = [3, 7]
@@ -39,5 +71,17 @@ def TruncatablePrime() -> list[int]:
midb = product(middle, repeat=length - 2) midb = product(middle, repeat=length - 2)
midb = [int("".join(map(str, x))) for x in midb] midb = [int("".join(map(str, x))) for x in midb]
nums = combine_lists(begin, midb, end) nums = combine_lists(begin, midb, end)
for num in nums : for num in nums:
if is if is_prime(num):
if truncate_left(num) and truncate_right(num):
res.append(num)
return res
@timer
def main():
print(sum(TruncatablePrime()))
if __name__ == "__main__":
main()