求满足特定数学条件的5位数:代码输出与预期不符的调试问题
排查5位数数字逻辑题的代码错误
先明确你的需求:
找到一个5位数,使得将1放在该数开头形成的6位数,是将1放在该数末尾形成的6位数的1/3。预期答案为42857,但当前代码运行后输出10000,请求排查代码逻辑错误。
先看你写的原始代码:
x = 100000 while x < 100000: y = x + 100000 z = (3*10000)-1/(10-3) if y != z: x += 1 else: print(x) break
几个关键错误点:
循环逻辑完全失效
你把初始x设为100000,循环条件却是while x < 100000——这直接导致循环体一次都不会执行!因为100000根本不小于100000。你要找的是5位数,范围应该是10000到99999,所以初始x应该设为10000,循环条件改成x < 100000才对。数学表达式完全错误
首先得把问题转化为正确的数学等式:- 设目标5位数为
x,把1放开头的6位数是100000 + x(1在十万位,相当于1×100000加上原数) - 把1放末尾的6位数是
x * 10 + 1(原数左移一位即×10,再把1补在个位) - 题目要求:
100000 + x = (x * 10 + 1) / 3
你代码里的z完全是无意义的计算,既没有对应正确的等式,还存在运算顺序问题(1/(10-3)会先计算,结果是个小数,和整数逻辑完全不搭)。
- 设目标5位数为
break语句位置错误
你把break写在循环外面,即使循环能执行,它也起不到终止循环的作用。正确的做法是找到目标数后,在print语句后面加break。
修正后的代码
方式一:直接解方程(最高效)
我们可以直接通过数学计算得到结果,不用循环:
# 从等式推导:3*(100000 + x) = 10x + 1 → 300000 +3x =10x+1 →7x=299999 x = 299999 // 7 print(x) # 输出42857
方式二:循环遍历验证
如果你想用循环来验证,代码应该是这样:
x = 10000 while x < 100000: num_start_with_1 = 100000 + x num_end_with_1 = x * 10 + 1 # 用乘法避免浮点运算误差 if num_start_with_1 * 3 == num_end_with_1: print(x) break # 找到结果后终止循环 x += 1
运行这段代码就能得到正确的42857啦。
内容的提问来源于stack exchange,提问作者user9843104
相关产品推荐
相关产品推荐

