题目描述
分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
接口说明
/*
功能: 将分数分解为埃及分数序列
输入参数:
String pcRealFraction:真分数(格式“8/11”)
返回值:
String pcEgpytFraction:分解后的埃及分数序列(格式“1/2+1/5+1/55+1/100”)
*/
public static String ConvertRealFractToEgpytFract(String pcRealFraction)
{
return null;
}
输入描述:
输入一个真分数,String型
输出描述:
输出分解后的string
示例1
输入
8/11
输出
1/2+1/5+1/55+1/110
思路:
链接:https://www.nowcoder.com/questionTerminal/e0480b2c6aa24bfba0935ffcca3ccb7b
来源:牛客网
贪心算法】
设a、b为互质正整数,a<b 分数a/b 可用以下的步骤分解成若干个单位分数之和:
步骤一: 用b除以a,得商数q1及余数r1,即b=a*q1+r1
步骤二: a/b=1/(q1+1)+(a-r)/b(q1+1)
步骤三: 重复步骤2,直到分解完毕
3/7=1/3+2/21=1/3+1/11+1/231
13/23=1/2+3/46=1/2+1/16+1/368
以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:
设某个真分数的分子为a,分母为b;
把c=(b/a+1)作为分解式中第一个埃及分数的分母;
将a-b%a作为新的a;
将b*c作为新的b;
如果a等于1,则最后一个埃及分数为1/b,算法结束;
如果a大于1但是a能整除b,则最后一个埃及分数为1/(b/a),算法结束;
否则重复上面的步骤。
最终要达到的目标是分解式中所有分数的分子都为1,若不是则需要进行处理,故分子是否为1作为循环条件。
if (b % (a - 1) == 0)当一个真分数分子不为1时,首先不是进行贪心算法,而是先判断能否进行一个偷巧的分解,即若b%(a-1)==0,则a/b=1/[b/(a-1)]+1/b
while True:
try:
numerator,denominator=map(int,input().split('/'))
result=''
while numerator!=1:
if denominator%(numerator-1)==0:#当一个真分数分子不为1时,首先不是进行贪心算法,而是先判断能否进行一个偷巧的分解
result+='1/'+str(denominator//(numerator-1))+'+'
numerator=1
else:#贪心算法
result+='1/'+str(denominator//numerator+1)+'+'
tempnumerator=numerator-denominator%numerator#因为会影响numerator的值
denominator=denominator*(denominator//numerator+1)
numerator=tempnumerator
if denominator%numerator==0:
denominator=denominator//numerator
numerator=1
result+='1/'+str(denominator)
print(result)
except:
break