题目如下:
本题要求编写程序,计算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 f(a,b):
fac = b
while a % fac:
r = a % fac
a = fac
fac = r
return fac
def lst(x):
if x[0] == '-':
lst_x = [-1]
a, b = x[1:].split('/')
else:
lst_x = [1]
a, b = x.split('/')
a, b = int(a), int(b)
fac = f(a, b)
a = a // fac
b = b // fac
lst_x.append(a)
lst_x.append(b)
return lst_x
# 输出打印形式 最简形式
def print_x(num):
if num[1] ==0 or num[2] == 0:
return '0'
lst = [num[0]]
lst.append(num[1] // num[2])
a = num[1] % num[2]
b = num[2]
fac = f(a, b)
a = a // fac
b = b // fac
lst.append(a)
lst.append(b)
str_x =''
if lst[1] == 0:
if lst[2] != 0:
str_x += str(lst[2])
str_x += '/'
str_x += str(lst[3])
else:
str_x += str(lst[1])
if lst[2] == 0:
pass
else:
str_x += ' '
str_x += str(lst[2])
str_x += '/'
str_x += str(lst[3])
if lst[0] == -1:
str_x = '(-%s)'%str_x
return str_x
# 有理数的加减乘除运算,参数a, b 的格式为[ -1 , 3, 2]
def sum_(a,b):
a1 = a[0] * a[1] * b[2]
b1 = b[0] * b[1] * a[2]
r = a1+b1
if r<0:
ret=[-1]
r *= -1
else:
ret=[1]
ret.append(r)
ret.append(a[2]*b[2])
return ret
def sub_(a,b):
c = b.copy()
c[0] = c[0]*(-1)
ret = sum_(a,c)
return ret
def mul_(a,b):
ret = [a[0] * b[0]]
ret.append(a[1] * b[1])
ret.append(a[2] * b[2])
# print(ret)
return ret
def div_(a,b):
b[1],b[2] = b[2],b[1]
ret = mul_(a,b)
return ret
if __name__ == '__main__':
x,y = input().split()
lst_x = lst(x)
lst_y = lst(y)
# print(lst_x)
# print(lst_y)
x = print_x(lst_x)
y = print_x(lst_y)
r1 = print_x(sum_(lst_x,lst_y))
r2 = print_x(sub_(lst_x,lst_y))
r3 = print_x(mul_(lst_x,lst_y))
r4 = print_x(div_(lst_x,lst_y))
if y == '0':
r4 = 'Inf'
print(x, '+', y, '=', r1)
print(x, '-', y, '=', r2)
print(x, '*', y, '=', r3)
print(x, '/', y, '=', r4)
先看主函数,读取数据处理成诸如[-1,5,3]这样的列表形式lst_x, lst_y,第一位是数的正负号,第二位是分子,第三位是分母;然后调用四则运算的函数分别计算并用print_x函数将结果格式化为输出的样式;最后输出四行结果。
本题的主要思想:读取数据后以及四则运算过程中,分数的存储格式均为[符号,分子,分母],是一个假分数,但是必须消掉最大公约数的,假分数便于四则运算(不要因为最终结果要化简就将整数部分过早提出);
符号用1,-1表示,便于四则运算最后结果符号的判断和运算,如乘法a[0] * b[0],就可以判断其符号。
注意:0的问题,一是print_x函数中整数部分是0,或分子是0的情况;
二是除法时0的问题,r4为0时结果换为‘Inf',而除法时由于调用的乘法函数,结果的分母可能为0,所以print_x函数第一句先做判断。