1 Star 0 Fork 0

阿坚/projecteuler

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
p071.py 1.67 KB
一键复制 编辑 原始数据 按行查看 历史
阿坚 提交于 2022-05-25 22:23 . 72-undone
"""
Problem 71: https://projecteuler.net/problem=71
Ordered fractions
Consider the fraction n/d, where n and d are positive
integers. If n<d and HCF(n,d)=1, it is called a reduced proper fraction.
If we list the set of reduced proper fractions for d ≤ 8
in ascending order of size, we get:
1/8, 1/7, 1/6, 1/5, 1/4, 2/7, 1/3, 3/8, 2/5, 3/7,
1/2, 4/7, 3/5, 5/8, 2/3, 5/7, 3/4, 4/5, 5/6, 6/7, 7/8
It can be seen that 2/5 is the fraction immediately to the left of 3/7.
By listing the set of reduced proper fractions for d ≤ 1,000,000
in ascending order of size, find the numerator of the fraction
immediately to the left of 3/7.
"""
# _*_ conding:UTF-8 _*_
'''
@author = Kuperain
@email = kuperain@aliyun.com
@IDE = VSCODE Python3.8.3
@creat_time = 2022/5/24
'''
def solution(d: int = 1000000, target=3/7) -> list:
'''
if p/q is the fraction immediately to the left of 3/7,
min{3/7 - p/q > 0}, we wish max(p) for q
p < 3q/7
because p/q < (p+1)/(q+1), so comparatively speaking,
the bigger for q, the better
we search q inversely to reduce operations
'''
res_p = 0
res_q = 0
diff = target
for q in range(d, 0, -1):
p, m = divmod(3*q, 7)
if m == 0:
p -= 1
tmp = target - p/q
if tmp < diff:
res_p, res_q, diff = p, q, tmp
# very few times (just twice for d = 1000000)
import math
g = math.gcd(res_p, res_q)
res_p, res_q = res_p//g, res_q//g
return res_p, res_q, res_p/res_q
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=False)
print(solution())
# (428570, 999997, 0.42857128571385716)
# 3/7 = 0.42857142857142855
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/kuperain/projecteuler.git
git@gitee.com:kuperain/projecteuler.git
kuperain
projecteuler
projecteuler
master

搜索帮助