欧拉项目提高代码质量的系列任务见👇链接介绍
计算科学的数学之欧拉项目问题
Euler Problem 26https://projecteuler.net/problem=26
Problem Statement: 一个单位分数的分子中含有1。分母为2至10的单位分数的十进制表示方法如下 给出了分母为2至10的单位分数的小数表示法。
1/3 = 0.(3)
1/4 = 0.25
1/5 = 0.2
1/6 = 0.1(6)
1/7 = 0.(142857)
1/8 = 0.125
1/9 = 0.(1)
1/10 = 0.1
其中0.1(6)意味着0.166666......,并且有1位数的重复周期。可见 可以看出,1/7有一个6位数的循环周期。找出d<1000的值,其中1/d包含最长的重复周期 在其小数部分中包含最长的循环周期。简洁有惊喜的写法
def solution(numerator: int = 1, digit: int = 1000) -> int:
"""
Considering any range can be provided,
because as per the problem, the digit d < 1000
>>> solution(1, 10)
7
>>> solution(10, 100)
97
>>> solution(10, 1000)
983
"""
the_digit = 1
longest_list_length = 0
for divide_by_number in range(numerator, digit + 1):
has_been_divided: list[int] = []
now_divide = numerator
for division_cycle in range(1, digit + 1):
if now_divide in has_been_divided:
if longest_list_length < len(has_been_divided):
longest_list_length = len(has_been_divided)
the_digit = divide_by_number
else:
has_been_divided.append(now_divide)
now_divide = now_divide * 10 % divide_by_number
return the_digit
下面的测试两个区段
Tests
if name == "main":
import doctest
doctest.testmod()
print(solution(10, 1000))
983
print(solution(2000, 3000))
2971
课堂上深入讨论
网友评论