代码拉取完成,页面将自动刷新
"""
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
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。