标签:真分数 frac gcd sys 牛客 solve file 机试 HJ82
1. 题目描述
2. Solution
1、思路
设要拆解的真分数为\(\frac{A}{B}\),设 B除以A的商为C,余数为D。即: \(B=A \cdot C+D\)。等式两边同时除以A,可得
\(\frac{B}{A} = C + \frac{D}{A} < C + 1(\because D < A)\) ,
易知C + 1是大于\(\frac{B}{A}\)的最小分数。将分式倒置有
\(\frac{A}{B} > \frac{1}{C+1}\)
即为真分数\(\frac{A}{B}\)包含的最大埃及分数。设\(E=C+1\),则有
\(\frac{A}{B} - \frac{1}{E} = \frac{AE-B}{BE}\)
继续上面的算法,直到A=1。
总结算法:
-
取\(g = gcd(A, B), A = A / g, B = B / g,除掉最大公约数\)
-
\(C = \left[ \frac{B}{A} \right] 向上取整, E = C + 1,导出 \frac{1}{E}\)
-
\(A =AE-B, B = BE,迭代计算,直到A=1\)
2、实现
最简单的实现自然是递归
import sys
if sys.platform != "linux":
file_in = open("input/HJ82.txt")
sys.stdin = file_in
def gcd(a, b):
return a if b == 0 else gcd(b, a % b)
def solve(A, B):
if A == 1:
print(f"1/{B}")
return
g = gcd(A, B)
A = A // g
B = B // g
C = B // A
E = C + 1
print(f"1/{E}", end="+")
solve(A * E - B, B * E)
for line in sys.stdin:
A, B = list(map(int, line.strip().split("/")))
solve(A, B)
标签:真分数,frac,gcd,sys,牛客,solve,file,机试,HJ82 来源: https://www.cnblogs.com/junstat/p/16177295.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。