### PTA 乙级 1034 有理数四则运算题目要求
本题要求编写程序,计算 2 个有理数的和、差、积、商。输入为两个有理数,格式为 `a1/b1 a2/b2`,其中 `a1`、`b2` 为分子,`b1`、`b2` 为分母。输出格式为每个运算结果占一行,格式为“有理数1 运算符 有理数2 = 结果”,其中有理数的输出格式为最简形式,负数要加括号。
### 思路分析
1. **数据表示**:使用结构体来表示有理数,包含分子和分母两个成员。
2. **化简函数**:编写一个函数来化简有理数,即求出分子和分母的最大公约数并进行约分。
3. **四则运算函数**:分别编写加法、减法、乘法和除法的函数,根据有理数的运算法则进行计算。
4. **输出函数**:编写一个函数来格式化输出有理数,处理负数、假分数等情况。
### 代码实现
```python
# 求最大公约数
def gcd(a, b):
while b:
a, b = b, a % b
return a
# 化简分数
def simplify(num, den):
if den < 0:
num = -num
den = -den
d = gcd(abs(num), den)
return num // d, den // d
# 输出分数
def print_fraction(num, den):
if num == 0:
return '0'
is_negative = num < 0
num = abs(num)
integer_part = num // den
remainder = num % den
if is_negative:
if integer_part and remainder:
return f"(-{integer_part} {remainder}/{den})"
elif integer_part:
return f"(-{integer_part})"
else:
return f"(-{remainder}/{den})"
else:
if integer_part and remainder:
return f"{integer_part} {remainder}/{den}"
elif integer_part:
return str(integer_part)
else:
return f"{remainder}/{den}"
# 加法
def add(num1, den1, num2, den2):
new_num = num1 * den2 + num2 * den1
new_den = den1 * den2
return simplify(new_num, new_den)
# 减法
def subtract(num1, den1, num2, den2):
new_num = num1 * den2 - num2 * den1
new_den = den1 * den2
return simplify(new_num, new_den)
# 乘法
def multiply(num1, den1, num2, den2):
new_num = num1 * num2
new_den = den1 * den2
return simplify(new_num, new_den)
# 除法
def divide(num1, den1, num2, den2):
if num2 == 0:
return None
new_num = num1 * den2
new_den = den1 * num2
return simplify(new_num, new_den)
# 主函数
def main():
a1, b1 = map(int, input().split('/'))
a2, b2 = map(int, input().split('/'))
# 加法
result_num, result_den = add(a1, b1, a2, b2)
print(f"{print_fraction(a1, b1)} + {print_fraction(a2, b2)} = {print_fraction(result_num, result_den)}")
# 减法
result_num, result_den = subtract(a1, b1, a2, b2)
print(f"{print_fraction(a1, b1)} - {print_fraction(a2, b2)} = {print_fraction(result_num, result_den)}")
# 乘法
result_num, result_den = multiply(a1, b1, a2, b2)
print(f"{print_fraction(a1, b1)} * {print_fraction(a2, b2)} = {print_fraction(result_num, result_den)}")
# 除法
result = divide(a1, b1, a2, b2)
if result is None:
print(f"{print_fraction(a1, b1)} / {print_fraction(a2, b2)} = Inf")
else:
result_num, result_den = result
print(f"{print_fraction(a1, b1)} / {print_fraction(a2, b2)} = {print_fraction(result_num, result_den)}")
if __name__ == "__main__":
main()
```
### 复杂度分析
- **时间复杂度**:主要的时间开销在于求最大公约数,每次求最大公约数的时间复杂度为 $O(log(min(a, b)))$,因此总的时间复杂度为 $O(log(max(|num|, den)))$。
- **空间复杂度**:只使用了常数级的额外空间,因此空间复杂度为 $O(1)$。
###