1034 有理数四则运算 Python实现

本文介绍了一个计算两个有理数加减乘除的程序实现方法,使用了欧几里得算法进行约分,并提供了格式化输出的功能。程序能够处理包括负数和零在内的各种情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1034 有理数四则运算(20)(20 分)

本题要求编写程序,计算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

问题分析:使用欧几里得算法 gcd() 计算公约数,函数 fmt() 格式化输出,fmt2() 对分数进行约分

程序:

def gcd(m,n):#欧几里得算法
    m = abs(m)
    n = abs(n)
    if m<n:
        m,n = n,m
    while m%n!=0:
        r = m%n
        m = n
        n = r
    return n

def fmt(m,n):
    if m=="Inf":
        return m
    if m<0 and n<0:
        m = -m
        n = -n
    a = 0#整数部分
    b = []#分数部分
    str1 = ""
    x = abs(m)
    y = abs(n)
    if x==0:
        str1 = "0"
    else:
        a = x//y
        b = [x-a*y,y]
        if m<0 or n<0:
            if a==0:
                str1 = "(-"+str(b[0])+"/"+str(b[1])+")"
            elif b[0]==0:
                str1 = "(-"+str(a)+")"
            else:
                str1 = "(-"+str(a)+" "+str(b[0])+"/"+str(b[1])+")"
        else:
            if a==0:
                str1 = str(b[0])+"/"+str(b[1])
            elif b[0]==0:
                str1 = str(a)
            else:
                str1 = str(a)+" "+str(b[0])+"/"+str(b[1])
    return str1

def fmt2(b):
    for i in b:
        if i[0]==0:
            i[0]=0
            i[1]=1
        else:
            k = gcd(abs(i[0]),i[1])
            if i[0]<0:
                i[0] = -(abs(i[0])//k)
            else:
                i[0] = i[0]//k
            i[1] = i[1]//k
            
a = input().split()
b = []
c = ['+','-','*','/']
for i in a:
    b.append([int(j) for j in i.split('/')])
fmt2(b)
result = []
if b[1][0]!=0:
    result.append([b[0][0]*b[1][1]+b[1][0]*b[0][1],b[0][1]*b[1][1]])
    result.append([b[0][0]*b[1][1]-b[1][0]*b[0][1],b[0][1]*b[1][1]])
    result.append([b[0][0]*b[1][0],b[0][1]*b[1][1]])
    result.append([b[0][0]*b[1][1],b[0][1]*b[1][0]])
    fmt2(result)
else:
    result.append(b[0])
    result.append(b[0])
    result.append([0,0])
    result.append(["Inf","Inf"])
for i in range(4):
    print("%s %s %s %s %s"%(fmt(b[0][0],b[0][1]),c[i],fmt(b[1][0],b[1][1]),"=",fmt(result[i][0],result[i][1])))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫虫(——)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值