|  | 
 
| 
1. 编写一个程序,求 100~999 之间的所有水仙花数。
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数
 
 复制代码
for i in range(100, 1000):                #这个能理解,i为100-999中的数
    sum = 0                                #提前设置个sum = 0,这个sum表示啥意思呢?水仙花数吗?
    temp = i                                #这里赋值temp为i,也就是100-999中的数字
    while temp:                                #while temp是什么意思,是否简写了?其实是while temp == range(100,1000)?
        sum = sum + (temp%10) ** 3                #这个算法看不懂,写的啥意思啊?
        temp //= 10         # 注意这里要使用地板除哦~                #这里temp = int(temp/10) 为什么还要弄个0.1temp?
    if sum == i:
        print(i)
 整个代码实现的逻辑方式,为什么这样做,我完全摸不着北,求大神给以小白关照!拜托啦!
 
 本帖最后由 jackz007 于 2020-1-10 15:08 编辑 
复制代码for i in range(100, 1000):                
    sum = 0                                 # 判断水仙花数需要计算 i 的百位、十位、个位数的立方和,sum 就是用来计算这个立方和的,因为后面需要通过循环累加的方式进行计算,需要为 sum 赋初始值 0。
    temp = i                                # 后面的计算需要用到 i ,但是,如果直接使用 i, 会破坏 i 值,所以,用 temp 来进行代理,目的是保护 i。
    while temp:                             # 循环入口,只要 temp 的值不为 0 就循环
        sum = sum + (temp % 10) ** 3        # 这是累加计算,temp % 10 会得到 temp 的个位数值,sum 的初始值是 0,如果是第一次循环,sum = 个位数的立方,第二次循环,sum = 个位数立方 + 十位数立方  
        temp //= 10                         # 因为已经取到了 temp 的个位数,所以,temp = temp // 10,temp 百位变十位,十位变个位,个位数被丢弃。
    if sum == i:                            # 如果 i 与 sum 相等
        print(i)                            # i 就是水仙花数,把它打印出来
        现以 temp = 578 为例,来展开 while 循环,以加深理解:
 复制代码第 1 次循环:temp = 578,sum = sum + (temp % 10) ** 3 = 0 + 8 ** 3 = 8 ** 3      , temp = temp // 10 = 578 // 10 = 57
第 2 次循环:temp =  57,sum = sum + (temp % 10) ** 3 = 8 ** 3 + 7 ** 3          , temp = temp // 10 =  57 // 10 =  5
第 3 次循环:temp =   5,sum = sum + (temp % 10) ** 3 = 8 ** 3 + 7 ** 3 + 5 ** 3 , temp = temp // 10 =   5 // 10 =  0
    temp = 0 循环终止,sum = 8 ** 3 + 7 ** 3 + 5 ** 3
        于是 578 各个位的立方和便这样被计算出来了 | 
 |