1. 题目解析与需求理解
PAT乙级1054题是一道典型的字符串处理与数值验证题目,主要考察程序员对输入数据的校验能力和边界条件的处理意识。题目要求我们编写程序来识别给定输入是否为合法的"实数",这里的"实数"定义比常规数学概念更加严格,有着明确的格式规范。
在实际开发中,类似的需求非常常见。比如电商系统需要验证用户输入的价格格式,科学计算程序需要确保输入参数的合法性,金融系统对金额格式有严格要求等。这类问题的核心在于:如何用精确的规则来定义"合法",并通过代码高效实现校验。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 合法实数定义拆解
根据题目描述,合法的实数需要满足以下所有条件:
-
格式要求:
- 必须包含且仅包含数字、正负号和小数点
- 正负号只能出现在最前面
- 小数点只能出现一次
- 小数点前后至少有一个数字
-
数值范围要求:
- 绝对值不超过1000
- 小数部分不超过2位(当有小数点时)
这些条件可以转化为正则表达式的各个部分:
^[+-]?:可选的正负号开头\d+:至少一位整数部分(\.\d{1,2})?$:可选的小数部分(1-2位)
但要注意题目对边界条件的特殊要求:
- 像".5"这样的输入虽然数学上合法,但不符合题目格式要求
- "123."也不符合要求,必须有小数数字
- "+1000.00"刚好在边界上,而"1000.01"就超出范围了
3. 解决方案设计与实现
3.1 正则表达式方案
最直接的实现方式是使用正则表达式进行模式匹配:
python复制import re
pattern = r'^[+-]?\d+(\.\d{1,2})?$'
def is_valid_real(s):
if not re.fullmatch(pattern, s):
return False
try:
num = float(s)
return abs(num) <= 1000
except ValueError:
return False
这个方案简洁明了,但需要注意几个细节:
- 使用
fullmatch确保整个字符串匹配,而不是部分匹配 - 即使正则通过,仍需转换
