计算分数

GitHub跳转原题关系图返回列表

用正则提取带符号分数,并交给 fractions.Fraction 自动完成精确运算与约分。

OJ: luogu

题目 ID: P1572

难度:入门

标签:字符串分数正则表达式python

日期: 2026-06-19 10:22

题意

计算只含分数加减的表达式,输出整数或最简分数。

思路

表达式中的每一项都符合“可选正负号 + 分子 + / + 分母”。正则 [+-]?\d+/\d+ 可以按原顺序提取全部项。

Python 标准库 Fraction 能从 "-1/4" 这样的字符串建立精确有理数,并自动通分、约分。将所有项映射为 Fraction 后求和即可。

若最终分母为 1,只输出分子;否则 Fraction 的字符串形式已经是最简的 p/q

Python 知识

  • re.findall 返回所有不重叠匹配,符号会与后面的分数一起保留。
  • map(Fraction,tokens) 惰性地把每个字符串转换为精确分数。
  • sum(...,Fraction()) 指定有理数零作为初值。
  • Fraction.numerator/denominator 直接访问最简分子分母。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/map_reduce_filter.mdmapsum 归约。
  • /home/rainboy/mycode/hugo-blog/content/program_language/python/input_output_and_strings.md:字符串提取和输出。

代码

python
import re
from fractions import Fraction


expression = input().strip()
result = sum(map(Fraction, re.findall(r"[+-]?\d+/\d+", expression)), Fraction())
print(result.numerator if result.denominator == 1 else result)

复杂度

表达式长度不超过 100,解析为 O(n)O(n);有理数运算还包含整数 gcd 的对数代价。额外空间 O(n)O(n)

总结

标准库已经完整封装了有理数运算。识别并正确使用 Fraction,比手写解析、通分和约分更短也更可靠。