zoukankan      html  css  js  c++  java
  • PAT 有理数四则运算

    本题要求编写程序,计算 2 个有理数的和、差、积、商。

    输入格式:

    输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。

    输出格式:

    分别在 4 行中按照 有理数1 运算符 有理数2 = 结果 的格式顺序输出 2 个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式 k a/b,其中 k 是整数部分,a/b 是最简分数部分;若为负数,则须加括号;若除法分母为 0,则输出 Inf。题目保证正确的输出中没有超过整型范围的整数。

    输入样例 1:

    2/3 -4/2

    输出样例 1:

    2/3 + (-2) = (-1 1/3)
    2/3 - (-2) = 2 2/3
    2/3 * (-2) = (-1 1/3)
    2/3 / (-2) = (-1/3)

    输入样例 2:

    5/3 0/6

    输出样例 2:

    1 2/3 + 0 = 1 2/3
    1 2/3 - 0 = 1 2/3
    1 2/3 * 0 = 0
    1 2/3 / 0 = Inf
    #将输入的两个分数和计算的结果转化成题目要求的最简形式
    def hjian(fenshu):
        a, b = fenshu.split('/')
        fenzi = int(a)  # 分子
        fenmu = int(b)  # 分母
        mcg=zd(fenzi,fenmu)
        fenzi//=mcg
        fenmu//=mcg
        z = fenzi // fenmu  # 整数部分
        f = fenzi % fenmu  # 分数部分的分子
        if fenzi == 0:
            return '0'
        elif z and f == 0:
            return str(z)
        elif z == 0 and f:
            return str(f) + '/' + str(fenmu)
        elif z and f:
            return str(z) + ' ' + str(f) + '/' + str(fenmu)
    #返回x和y的最大公因数
    def zd(x,y):
        if x<y:
            x,y=y,x
        while y!=0:
            n=x%y
            x,y=y,n
        return x
    a, b = input().strip().split()
    aa0,aa1=int(a.split('/')[0]),int(a.split('/')[1])
    bb0,bb1=int(b.split('/')[0]),int(b.split('/')[1])
    abz,abm=aa0*bb1+aa1*bb0,aa1*bb1  
    ab=str(abz)+'/'+str(abm)   # a+b
    ajbz=aa0*bb1-aa1*bb0
    ajb=str(ajbz)+'/'+str(abm)  # a-b
    acbz=aa0*bb0
    acb=str(acbz)+'/'+str(abm)  # a*b
    aa,bb,cc,dd,ee,ff='','','','','',''
    if a[0] != '-':
        aa=hjian(a)
    else:
        aa=hjian(a[1:])
        aa='('+'-'+aa+')'
    if ab[0]!='-':
        cc=hjian(ab)
    else:
        ab=hjian(ab[1:])
        cc='('+'-'+ab+')'
    if ajb[0]!='-':
        dd=hjian(ajb)
    else:
        ajb=hjian(ajb[1:])
        dd='('+'-'+ajb+')'
    if acb[0]!='-':
        ee=hjian(acb)
    else:
        acb=hjian(acb[1:])
        ee='('+'-'+acb+')'
    if b[0]!='-':
        bb=hjian(b)
    else:
        bb=hjian(b[1:])
        bb='('+'-'+bb+')'
    # print(aa,bb)
    print(aa+' '+'+'+' '+bb+' '+'='+' '+cc)
    print(aa+' '+'-'+' '+bb+' '+'='+' '+dd)
    print(aa+' '+'*'+' '+bb+' '+'='+' '+ee)
    ahb=''
    #除法除数为0的情况
    if bb=='0':
        print(aa+' '+'/'+' '+bb+' '+'='+' '+'Inf')
    else:
        ahbz=aa0*bb1
        ahbm=aa1*bb0
        #如果除数为负,则做除法时,乘除数的倒数,会把符号放到分母上,所以,需要处理一下
        if ahbm<0:
            if ahbz<0:
                ahb=str(abs(ahbz))+'/'+str(abs(ahbm))
            else:
                ahb=str(0-ahbz)+'/'+str(abs(ahbm))
        else:
            ahb=str(ahbz)+'/'+str(ahbm)
        if ahb[0]!='-':
            ff=hjian(ahb)
        else:
            ahb=hjian(ahb[1:])
            ff='('+'-'+ahb+')'
        print(aa+' '+'/'+' '+bb+' '+'='+' '+ff)

    全程稀里糊涂,写了这么多行,快看晕了,终于我把Python代码的优雅和简洁全扔掉了,确实写的很臃肿

  • 相关阅读:
    [转]王垠的过去和现状
    支持向量机(SVM)基础
    C语言编程心得
    Fortran学习心得
    gdb使用心得
    大道至简第一章读后感
    第一个音符
    Exercise 1.20 最大公约数算法
    Exercise 1.19 Fast Fibonacci
    Exercise 1.16 1.17 1.18
  • 原文地址:https://www.cnblogs.com/andrew3/p/12709795.html
Copyright © 2011-2022 走看看