PAT(A) 1088. Rational Arithmetic & PAT(B) 1034. 有理数四则运算(20)


Python

注意:

1、求最大公约数,需用辗转相除法,否则最后两个测试点超时

2、未解决问题,第三个测试点未通过


# coding=gbk
import math
line = raw_input().split()
a1= long(line[0].split('/')[0])
b1= long(line[0].split('/')[1])
a2= long(line[1].split('/')[0])
b2= long(line[1].split('/')[1])

def fractionReduction(a,b):
    if a<0:
        maxCF=maximumCommonFactor2(-a, b)
    else:
        maxCF=maximumCommonFactor2(a, b)
    a=a/maxCF
    b=b/maxCF
    return a,b
#由于due to fractionReduction, no longer need LCM
# def leastCommonMultiple(b1,b2):
#     if b1<b2:
#         temp=b1
#         b1=b2
#         b2=temp
#     for leastCM in xrange(b1,b1*b2+1,1):
#         if leastCM%b1==0 and leastCM%b2==0:
#             return leastCM

# def maximumCommonFactor(a,b):
#     maxCF=1
#     for i in xrange(1,min(a,b)+1):
#         if a%i==0 and b%i==0:
#             maxCF=i
#     return maxCF
###########################################
def maximumCommonFactor2(a,b):
    r=a%b
    while r:
        a=b
        b=r
        r=a%b
    return b
###########################################

def getSimple_C_A_B(a,b): #attention: Python -8/6=-2, -8%6= 4
    if a>0:
        c=a/b
        a=a%b
    elif a==0 and b==0:
        return 0,0,0
    else:
        c=(-a)/b
        c=-c
        a=(-a)%b
        if c==0:
            a=-a
    return c,a,b

def add(a1,b1,a2,b2):
    b3=b1*b2
    a3 = a1*b2+a2*b1
    a3,b3=fractionReduction(a3,b3)
    return a3,b3

def minus(a1,b1,a2,b2):
    b3=b1*b2
    a3 = a1*b2-a2*b1
    a3,b3=fractionReduction(a3,b3)
    return a3,b3

def multiply(a1,b1,a2,b2):
    a3=a1*a2
    b3=b1*b2
    a3,b3=fractionReduction(a3,b3)
    return a3,b3

def divide(a1,b1,a2,b2):
    a3=a1*b2
    b3=b1*a2
    if b3==0:
        return 0,0
    if b3<0:
        a3=-a3
        b3=-b3
    a3,b3=fractionReduction(a3,b3)
    return a3,b3


def myPrintUnit(c_print,a_print,b_print):
    s=''
    if c_print>0:
        s+=str(c_print)
        if a_print!=0:
            s+=' '
    elif c_print<0:
        s+='('
        s+=str(c_print)
        if a_print!=0:
            s+=' '
        else:
            s+=')'
        
    if a_print>0:
        s+=str(a_print)
        s+='/'
        s+=str(b_print)
        if c_print<0:
            s+=')'
    elif a_print<0:
        s+='('
        s+=str(a_print)
        s+='/'
        s+=str(b_print)
        s+=')'
        
    if c_print==0 and a_print==0:
        s='0'
    return s


#pUnit1, pUnit2
c1_print,a1_print,b1_print=getSimple_C_A_B(a1,b1)
c2_print,a2_print,b2_print=getSimple_C_A_B(a2,b2)
pUnit1= myPrintUnit(c1_print, a1_print, b1_print)
pUnit2= myPrintUnit(c2_print, a2_print, b2_print)

#+
a3_add,b3_add=add(a1,b1,a2,b2)
c3_add_print,a3_add_print,b3_add_print=getSimple_C_A_B(a3_add,b3_add)
pUnit3_add= myPrintUnit(c3_add_print, a3_add_print, b3_add_print)
#-
a3_minus,b3_minus=minus(a1, b1, a2, b2)
c3_minus_print,a3_minus_print,b3_minus_print=getSimple_C_A_B(a3_minus, b3_minus)
pUnit3_minus=myPrintUnit(c3_minus_print, a3_minus_print, b3_minus_print)
#*
a3_multi,b3_multi=multiply(a1, b1, a2, b2)
c3_multi_print,a3_multi_print,b3_multi_print=getSimple_C_A_B(a3_multi, b3_multi)
pUnit3_multi=myPrintUnit(c3_multi_print, a3_multi_print, b3_multi_print)
#/
a3_divi,b3_divi=divide(a1, b1, a2, b2)
if b3_divi==0:
    pUnit3_divi='Inf'
else:    
    c3_divi_print,a3_divi_print,b3_divi_print=getSimple_C_A_B(a3_divi, b3_divi)
    pUnit3_divi =myPrintUnit(c3_divi_print, a3_divi_print, b3_divi_print)

print pUnit1+' + '+pUnit2+' = '+pUnit3_add
print pUnit1+' - '+pUnit2+' = '+pUnit3_minus
print pUnit1+' * '+pUnit2+' = '+pUnit3_multi
print pUnit1+' / '+pUnit2+' = '+pUnit3_divi


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值