|
发表于 2020-2-4 16:07:02
|
显示全部楼层
纠结一天一夜,顿悟了。
*********************************************
for i in range(100, 1000):
sum = 0
temp = i
while temp:
sum = sum + (temp%10) ** 3
temp //= 10 # 注意这里要使用地板除哦~
if sum == i:
print(i)
******************************************
sum = sum + (temp%10) ** 3 这个表达式中,temp%10 是为了取得 个位数值(以153为例子),取得了个位数的3
然后将 3 立方后,给sum。 sum=0+3*3=27
此时,还在整个while 循环体中,需要继续执行 temp //= 10 。 整个表达式为为了将 153,变成 15,3两部分(即:把一个三位数百位、十位与个位分开,变成2个部分,15,3)。现在再数值上,temp=15, 而这个15,再 while temp:中,为真,则这个循环还要继续执行。而,此时因为是继续前面的步骤(此时并不是完全重新开始,而是继续完成前面取值153这个数字,没有完成的循环),此时的temp是15,执行 temp%10 ,取到的值为5(这点特别注意,此时取得的5,其实是 153中的 十位 ,5。了解水仙花的定义可知道,这个十位是目前我们需要的数字就可以了。)现在将 十位的5 进行立方,的到125,此时,sum会进行 sum = sum + (temp%10) ** 3 指令(sum=27(由前面3*3得来)+(15%10)*3=27+125),
需要注意此时已经不知不觉 将 153中的 个位数3 ,十位数 5,分别进行了 立方计算。并且将2者的立法和 赋值给了 变量 sum
同时,当temp=15时,仍需要执行 temp//=10,此时,temp=1(这是取整)
从而又重新执行 while temp:(因为此时 temp=1,while 语句为真,可执行)
此时 temp=1 ,要知道 1其实是 153 的百位数值。 1%10 此时的余数1(好像小学知识,我也记得了,但应该是这个意思),从而执行 sum=(27+125)+1*3 需要注意 此时 已经将 1,5,3 都分别立方了。
这里面 sum=sum+(temp%10)*3 其实也执行了三次,有点迭代跟新的意思,具体是怎么个逻辑 我说不清,但理解应该是这样子的
此时循环体还需要执行, temp=1 所以 当执行 temp//=10 时候,得到的结果是 0,余1(小学知识,我也忘记了) 好了!此时的temp=0了(前面的地板刷不是取整的意思吗,就是 0)
当最新的temp=0时,while temp:为假。不执行后面的循环。
一直到这个地方!!!!!!while 语句才算停止循环。所以 执行 while 后面的指令 if sum == i:
要知道 temp 是从153 算的,而 temp=i, sum现在的数值就是 3*3+5*3+1*3=153 if成立,所以 输出。 如此循环。
好了, 对不对 都点个赞吧 。我也是想烂脑袋才看懂的。
|
|