问题描述
首先,stdio模块只是用来调用stdio.write()函数,与python中的print()函数完全一样。
让我在理解这段代码时头晕目眩的是这部分。 "while v > 0:" 就我的观点而言,v 值永远不会低于零。所以对我来说,它看起来是不停的无限循环。 v 将减半 按顺序。但在我看来,它永远不会低于零。所以,我想如果我给这个程序的输入值 5,那么这个程序会表现得像“1010000000...”这样的结果,但这个程序驱动正确答案“101”,这是十进制数 5 的正确二进制代码. 我错过了什么?
import sys
import stdio
n = int(sys.argv[1])
v = 1
while v <= n // 2:
v *= 2
print(v)
while v > 0:
if n < v:
stdio.write(0)
else:
stdio.write(1)
n -= v
v //= 2
stdio.writeln()
解决方法
它不会低于零(即负数),但它会下降到 0
。即,//=
会截断任何小数部分,这意味着 1 // 2
的计算结果为 0
。当 v
是 1
时,它产生 0
并且循环结束。
这是因为v
不是简单地除以2,而是没有余数,用v //= 2
表示。 //
在 Python 中表示无余数除法,而 /
是正常除法。
例如,如果 v = 2
,则
v //= 2
print(v) # 1
v //= 2
print(v) # 0,end of your while loop