真分数分解为埃及分数Python3

真分数分解为埃及分数

  • 真分数:分子小于分母
  • 埃及分数:分子数为1的真分数
    约定分数表示为a/b

** 但是注意,这两个算法给出来的结果并不是所有情况下都是相同! **

Example:
Input: 8/11
Output: 算法1: 1/2+1/5+1/37+1/4070 算法2: 1/2+1/5+1/55+1/110

算法一:基本,穷举

1、初始化i=2,分数为a/b
2、开始比较

  • if a=1, finish
  • if a/b>1/i: a/b=a/b-1/i, i=i+1, return 2
  • if a/b<1/i: i=i+1, return 2
# algorithm 1
def egypt(a,b):
    if a==1:
        return [b]
    i=1
    B=[]
    while a!=1:
        i+=1
        if a/b > 1/i:
            a,b = a*i-b, b*i
            B.append(i)
    B.append(b)
    return B
a,b=list(map(int,input().split('/')))
res=egypt(a,b)
res=['1/'+str(i) for i in res]
print('+'.join(res))

算法二:改进

1、初始化变量用来保存各个埃及分数的分母
2、while a!=1

  • if b%(a-1)=0: 分母为b//(a-1) and b
  • else: 分母为b//a + 1,更新分子分母
    if b%a=0, b=b//a, a=1
# Algorithm 2
a,b=list(map(int,input().split('/')))
res=[]
while a!=1:
    if b%(a-1)==0:
        res.append(b//(a-1))
        a=1
    else:
        q=b//a
        res.append(q+1)
        a = a-b%a
        b = b*(q+1)
        if b%a == 0:
            b = b//a
            a = 1
res.append(b)
res=['1/'+str(i) for i in res]
print('+'.join(res))

你可能感兴趣的:(2020校招)