Python随机数学题生成代码的正确答案计算算法求助
问题解答
你现有代码结构完全可以支撑需求,不需要调整整体框架,只需要替换标注(NOT FINISHED!)位置的计算逻辑即可。实现时不需要依赖额外第三方库,手动按照数学运算优先级分两轮计算就能得到正确结果。
核心实现逻辑
- 第一轮优先处理乘除运算:复制原数字列表和运算符列表作为临时计算变量,从左到右遍历运算符,遇到
*或/时,立刻计算当前位置左右两个数字的结果,用计算结果替换原两个数字的位置,同时删除当前已处理的运算符,遍历完成后列表中将仅剩余加减运算 - 第二轮处理加减运算:此时运算符列表只剩
+和-,从左到右依次累计计算即可,最终剩下的单个数值就是题目的正确结果 - 浮点精度兼容:由于除法会产生浮点数,答案判断时需要增加微小的精度容错,避免因二进制浮点数计算误差导致答对的题目被误判为错误
快速实现提示:如果是个人本地练习使用,也可以直接写
problem_solved = eval(problem_str)一行完成计算,但eval会执行传入字符串中的任意代码,存在安全风险,绝对不能用于接收外部不可信输入的生产环境,新手入门阶段更推荐手动实现优先级计算逻辑,夯实基础。
需替换/调整的代码段
- 替换原代码中
#calculating solution to the problem (NOT FINISHED!)下方的problem_solved = 0为如下代码:
# 复制临时列表做计算,不改动原生成的题目数据 temp_nums = num.copy() temp_opps = opp.copy() # 第一轮:从左到右处理所有乘除运算 i = 0 while i < len(temp_opps): current_op = temp_opps[i] if current_op in ("*", "/"): left_val = temp_nums[i] right_val = temp_nums[i+1] # 计算当前乘除结果 if current_op == "*": calc_res = left_val * right_val else: calc_res = left_val / right_val # 用计算结果替换原两个数,删除已处理的运算符 temp_nums[i:i+2] = [calc_res] temp_opps.pop(i) else: # 非乘除符号,移动到下一个运算符 i += 1 # 第二轮:从左到右处理剩余加减运算 problem_solved = temp_nums[0] for idx in range(len(temp_opps)): if temp_opps[idx] == "+": problem_solved += temp_nums[idx+1] else: problem_solved -= temp_nums[idx+1]
- 调整原有的答案判断逻辑,替换为带精度容错的判断,避免浮点误差:
# 增加1e-6的精度容错,兼容浮点数计算误差 if abs(user_solution - problem_solved) < 1e-6: print("Correct!") else: # 结果保留4位小数展示,避免长串无意义浮点尾 print(f"Wrong! The answer is {round(problem_solved, 4)}")
内容的提问来源于stack exchange,提问作者Mante
相关产品推荐
相关产品推荐

