蛇化第6课问题3,我需要一个代码如何以及为什么工作的分解



我正在使用Snakify,遇到了一个关于问题3的问题"二的力量";在while循环中

问题是:

对于给定的整数N,找出2x小于等于N的最大整数x,打印表达式2x的指数值和结果。禁止使用**操作

我编写了自己的代码,然后对照推荐的解决方案进行了检查,发现它是不同的。

我代码:

n=int(input())
x=1
y=0
while x*2<=n:
y+=1
x*=2
print(y, x)

开发者的解决方案:

n=int(input())
x=1
y=0
while x*2<=n:
y, x=y+1, x*2
print(y, x)

我试图通过删除代码的部分来找出开发人员的解决方案是如何工作的,并且无法弄清楚为什么我在删除第5行x*2后得到了错误TypeError: cannot unpack non-iterable int object。这里有x*2的目的是什么,它什么都不做?

我不明白为什么我需要y在第5行x=y+1前面,除了计算机否则使x成为一个元组而不理解它正在使用一系列命令而不是一个。调用y是多余的,因为对我来说,它看起来好像什么也没做,尽管它在做一些事情。

我也不明白x=y+1发生了什么,它在代码中的目的是什么?我知道你必须让x更有价值这样循环就不会无限进行但是y的值不会随着每次循环而增加因此x会保持不变加1?

我也想知道为什么它是"更好"/推荐的解决方案。它是否与效率有关,如果是,它如何以及为什么更有效率?

感谢您花时间阅读这篇文章,我希望没有什么令人困惑的。

很高兴回答你的问题。我已经看过你的描述了。

首先,您的代码和开发人员的代码是相同的。我建议您参考python操作符的优先级。

在此代码中y, x=y+1, x*2,=运算符小于,运算符。

所以,这段代码的工作原理是y=y+1, x=x*2.

我建议你使用数学模块和更有效的方法如下。

import math
n = int(input())
x = math.floor(math.sqrt(n))
print(x, x*x)

希望对你有帮助。谢谢,致以最诚挚的问候。