1 Star 0 Fork 0

阿坚/projecteuler

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
p057.py 1.67 KB
一键复制 编辑 原始数据 按行查看 历史
阿坚 提交于 2022-05-18 20:50 . 58
"""
Problem 57: https://projecteuler.net/problem=57
It is possible to show that the square root of two can be expressed as an infinite
continued fraction.
sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + ...)))
By expanding this for the first four iterations, we get:
1 + 1 / 2 = 3 / 2 = 1.5
1 + 1 / (2 + 1 / 2} = 7 / 5 = 1.4
1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17 / 12 = 1.41666...
1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/ 29 = 1.41379...
The next three expansions are 99/70, 239/169, and 577/408, but the eighth expansion,
1393/985, is the first example where the number of digits in the numerator exceeds
the number of digits in the denominator.
In the first one-thousand expansions, how many fractions contain a numerator with
more digits than the denominator?
"""
# _*_ conding:UTF-8 _*_
'''
@author = Kuperain
@email = kuperain@aliyun.com
@IDE = VSCODE Python3.8.3
@creat_time = 2022/5/18
'''
import math
def solution(limit: int = 10000) -> int:
'''
a1 = 1 + 1 / 2 = 3 / 2 = 1.5
a2 = 1 + 1 / (2 + 1 / 2} = 7 / 5 = 1.4
a3 = 1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17 / 12 = 1.41666...
...
a(k+1) = 1 + 1 / (ak + 1) k>=1
= (y + 2*x)/(y + x) if ak = y/x
>>> assert solution(8)==1
>>> assert solution(7)==0
'''
count = 0
times = 1
ak = (3, 2) # k = 1
while times < limit:
y, x = ak
y1, x1 = y + 2*x, y + x
g = math.gcd(y1, x1)
y1, x1 = y1//g, x1//g
ak = (y1, x1)
# print(ak)
if len(str(y1)) > len(str(x1)):
count += 1
times += 1
return count
if __name__ == "__main__":
import doctest
doctest.testmod(verbose=False)
print(solution())
# 1508
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Python
1
https://gitee.com/kuperain/projecteuler.git
git@gitee.com:kuperain/projecteuler.git
kuperain
projecteuler
projecteuler
master

搜索帮助