592. Fraction Addition and Subtraction

题目

592Fraction Addition and Subtraction

 

Given a string representing an expression of fraction addition and subtraction, you need to return the calculation result in string format. The final result should be irreducible fraction. If your final result is an integer, say 2, you need to change it to the format of fraction that has denominator 1. So in this case, 2 should be converted to 2/1.

分析(自己的方法)

分数加减法,要求输出结果必须是以分数的形式。首先,必然要用到通分、约分等操作,即求最小公倍数lcm和最大公约数gcd。其次,需要将输入中每个数的正负号(加/减)、分子和分母按照“+”、“-”、“/”分开存储,采用正则匹配

b = re.split('\+ | \- | \/', exp)

'\'为转换符号。求得所有分数分母的通分后结果,依次相加/减各个分数。最后将结果约分并输出

gcd

采用递归的方式: a>b, b>0, gcd(a, b)=gcd(b, a%b)

def gcd(self,a,b):#求最大公约数
    return self.gcd(b, a%b) if b else a

lcm

利用最大公约数的结果:lcm(a, b)=a*b/gcd(a, b)

def lcm(self,a,b):#求最小公倍数
    return a*b/self.gcd(a,b)

自己的方法

    def fractionAddition(self, expression):
        """
        :type expression: str
        :rtype: str
        """
        sign= ['']
        numerator= ['']
        denominator = ['']
        exp = expression
        if exp[0]!='-':
            exp ='+'+ exp
        b = re.split('\+|\-|\/',exp) #将各个分数的分子和分母分开
        n = len(b)/2 #保存表达式中分数的个数
        #print a,b,n,n2
        #保存各分数的符号
        j=0
        i = 0
        while i<n:
            if exp[j]=='+' or exp[j]=='-':
                sign.append(exp[j])
                i+=1
            j+=1
        #将输入的各个分数分开存储
        for i in range(n):
            numerator.append(int(b[2*i+1])) #各分数的分子,强制转换为int型之后存储 
            denominator.append(int(b[2*i+2])) #各分数的分母,同上
        print sign,numerator,denominator
        #求各分数分母的最小公倍数:den=reduce(lcm,denominator)
        den = 1
        for i in range(n):
            den = self.lcm(den,denominator[i+1])
        #print den
        #求结果的分子
        ans = 0
        for i in range(n):
            num = numerator[i+1]*den/denominator[i+1]
            #print num
            if sign[i+1]=='-':
                ans-=num
                #print ans
            else:
                ans+=num
                #print ans
        #整合结果,约简分数
        f = self.gcd(ans,den)
        ans /= f
        den /= f
        return str(ans)+'/'+str(den)

大神的方法:

将计算结果存于A/B,下一个参与计算的分数存于a/b,它们的和为(Ab+aB)/Bb,再进行约分即可。

提取输入中的分子和分母,并且将其转换为可迭代对象,使next()可以使用结果。

ints = iter(map(int, re.findall('[+-]?\d+', expression)))
 
import re
class Solution(object):
    def gcd(self,a,b):
        return self.gcd(b,a%b) if b else a
    def fractionAddition(self, expression):
        #iter函数将返回结果转换为迭代器的形式
        ints = iter(map(int, re.findall('[+-]?\d+', expression)))
        A, B = 0, 1
        for a in ints:
            b = next(ints)
            A = A * b + a * B
            B *= b
            g = self.gcd(A, B)
            A //= g
            B //= g
        return '%d/%d' % (A, B)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值