注意事项:
因为笔者的编程水平以自学为主,代码结构可能比较混乱、变量命名可能不够规范。
文章中的AC解法不一定最优,并且包含笔者强烈的个人风格,不喜勿喷,但欢迎在评论中理性讨论或者给出提升建议。
文章中提到的疑难点仅为个人在刷题过程中所遇到的情况,如有读者存在其他疑难点,欢迎在评论中加以补充,笔者会尽量将其加入到文章内容中。
合集:
题目:
1034 有理数四则运算
题目描述:
本题要求编写程序,计算 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
代码限制:
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
栈限制
8192 KB
AC解法:
import math
# 构造函数用于将分数转化为标准分数的形式
def format_conversion(x, y): # 入参为分子和分母的值
gcd = math.gcd(x, y) # 计算分子分母的最大公约数
x //= gcd # 分子除以最大公约数进行约分
y //= gcd # 分母除以最大公约数进行约分
flag = False if x * y >= 0 else True # 创建标记值用于判断分数是否为负,若为负则值为 True ,反之则为 False
x, y = abs(x), abs(y) # 将分子分母转换为绝对值,以便后续处理
if y == 1: # 若分母为 1 ,即整数情况
return f"{'(-' if flag else ''}{x}{')' if flag else ''}" # 返回整数形式,单独考虑负数的括号情况
if x >= y: # 若分子大于等于分母,即假分数情况
zs = x // y # 计算整数部分
sy = x - zs * y # 计算余数部分
if sy == 0: # 若余数为 0 ,即可以整除
return f"{'(-' if flag else ''}{zs}{')' if flag else ''}" # 返回整数形式,单独考虑负数的括号情况
else: # 余数不为 0
return f"{'(-' if flag else ''}{zs} {sy}/{y}{')' if flag else ''}" # 返回带分数形式,
# 单独考虑负数的括号情况
else: # 分子小于分母,即真分数情况
return f"{'(-' if flag else ''}{x}/{y}{')' if flag else ''}" # 返回真分数形式,单独考虑负数的括号情况
# 获取输入的数据
A, B = input().split() # 获取输入的两个分数
# 处理数据
A, B = list(map(int, A.split('/'))), list(map(int, B.split('/'))) # 分割两个分数的分子和分母部分
A = [A[0] // math.gcd(A[0], A[1]), A[1] // math.gcd(A[0], A[1])] # 约分第一个分数
B = [B[0] // math.gcd(B[0], B[1]), B[1] // math.gcd(B[0], B[1])] # 约分第二个分数
a, b = A.copy(), B.copy() # 创建两个分数的拷贝副本,避免修改原分数
lcm_ab = math.lcm(a[1], b[1]) # 计算两个分母的最小公倍数
bsa, bsb = lcm_ab // a[1], lcm_ab // b[1] # 计算两个分数的通分倍数
a[0], a[1], b[0], b[1] = a[0] * bsa, a[1] * bsa, b[0] * bsb, b[1] * bsb # 对两个分数进行通分
aA, bB = format_conversion(A[0], A[1]), format_conversion(B[0], B[1]) # 格式化两个原始分数
# 输出结果
print(f"{aA} + {bB} = {format_conversion(a[0] + b[0], a[1])}") # 输出加法运算的结果
print(f"{aA} - {bB} = {format_conversion(a[0] - b[0], a[1])}") # 输出减法运算的结果
print(f"{aA} * {bB} = {format_conversion(a[0] * b[0], a[1] * b[1])}") # 输出乘法运算的结果
print(f"{aA} / {bB} = {'Inf' if b[0] == 0 else format_conversion(a[0] * b[1], a[1] * b[0])}")
# 输出除法运算的结果,并单独处理除数为零的情况
题目解读:
本题描述比较易懂。
先获取输入的两个分数,再将分数化简用于在算式中表示,然后对两个分数分别进行四则运算,最后输出四则运算的完整算式及对应的化简结果。
疑难点:
本题无疑难点。
3048

被折叠的 条评论
为什么被折叠?



