解题思路:
1. 将分数拆分成分子和分母,模拟分数运算
1.1 化简分数 (只化简到分子为1的形式)
1.2 比较两个分数的大小
1.3 两个分数做差
2. 遍历因子(分子为1, 分母2~n)
2.1 对待分解的分数,减去因子,如果结果大于0,就记录该因子
2.2 如果结果==0,除了记录该因子,跳出循环
2.3 因子分母+1
class Solution:
def _gcd(self, fz, fm):
""" 化简分数 (只化简到分子为1的形式) """
if int(fz % fm) == 0:
return 1, fz//fm
else:
return fz, fm
def _compare_fs(self, fz, fm, fz_2, fm_2):
""" 比较两个分数的大小 """
if fm == fm_2:
return fz - fz_2
if fz == fz_2:
return fm_2 - fm
return fz*fm_2 - fz_2*fm
def _sub(self, fz, fm, fz_2, fm_2):
""" 两个分数做差 """
return self._gcd(fz * fm_2 - fz_2 * fm, fm*fm_2)
def solve(self, fz, fm):
rnt = list()
start_fm = 2
curr_fz, curr_fm = fz, fm
while True:
com_mp = self._compare_fs(curr_fz, curr_fm, 1, start_fm)
if com_mp == 0:
rnt.append(start_fm)
break
if com_mp > 0:
rnt.append(start_fm)
curr_fz, curr_fm = self._sub(curr_fz, curr_fm, 1, start_fm)
if curr_fz == 1:
rnt.append(curr_fm)
break
start_fm += 1
rnt_str = ""
for i in range(len(rnt)-1):
rnt_str += "1/" + str(rnt[i]) + "+"
rnt_str += "1/" + str(rnt[-1])
return rnt_str
import sys
if __name__ == '__main__':
is_IDE = False
if is_IDE:
fr = open("data/HJ82.txt", "r", encoding="utf-8")
else:
fr = sys.stdin
while True:
line = fr.readline().strip()
if line == "":
break
line_list = line.split("/")
print(Solution().solve(int(line_list[0]), int(line_list[1])))
if is_IDE:
fr.close()


京公网安备 11010502036488号