水仙花数小甲鱼答案的疑问
我觉得水仙花数这样的答案更容易理解for x in range(1,10):
for y in range(0,10):
for z in range(0,10):
if 100*x + 10*y + z == x**3 + y**3 + z**3 and 100<=100*x + 10*y + z<=999:
print(100*x + 10*y + z,end = "")
对于小甲鱼的答案,没有理解,为什么那样写源代码,while循环那样写的依据是什么?
for i in range(100, 1000):
sum = 0
temp = i
while temp:
sum = sum + (temp%10) ** 3
temp //= 10 # 注意这里要使用地板除哦~
if sum == i:
print(i) 我估计你感到困惑的应该是里面的while循环
while temp:
sum = sum + (temp%10) ** 3
temp //= 10
temp % 10 得到的是temp这个值的个位数字,比如 111 % 10 == 1,234 % 10 == 4
(temp % 10) ** 3 表示这个数字的三次方,比如 2 ** 3 == 2 * 2 * 2 == 8
temp //= 10 表示temp右移1位,比如 123 // 10 == 12,234 // 10 == 23,地板除的意思是整除,只取整数部分而去掉小数部分
所以整个while循环的操作就是,拿temp=543举个例子
第一次循环
sum = 0 + 3 ** 3 = 9
temp = 54
第二次循环
sum = 9 + 4**3 = 9 + 64 = 73
temp = 5
第三次循环
sum = 73 + 5**3 = 73 + 125 = 198
temp = 0
第四次循环条件判定失败,跳出while循环,最终sum == 198
后续的判定中sum != 543
所以543不是水仙花数 本帖最后由 checkily 于 2018-2-8 19:29 编辑
是的,这个取余和地板除方法很好用的,我也卡了好久没想明白。练习多了,就慢慢明白了。
其实只要能实现就行。当然理解别人写的也很重要。你的写法是没问题的。
我的写法跟小鱼的也不同:
def fun1():
for each in range(100,1000):
result=0
for j in : #把数字转成字符,再转成列表
result+=int(j)**3
if result==each:
print(result,end=",")
print("所有水仙花数分别是:",end="")
fun1() BngThea 发表于 2018-2-8 14:15
我估计你感到困惑的应该是里面的while循环
while temp:
sum = sum + (temp%10) ** 3
感谢您的讲解,思路很清晰!% 和 // 还能这样结合用,学习了! checkily 发表于 2018-2-8 19:27
是的,这个取余和地板除方法很好用的,我也卡了好久没想明白。练习多了,就慢慢明白了。
其实只要能实现就 ...
哇, 你的也很高端,也得好好思考,不懂再向您请教!
页:
[1]