近期在学习Python的过程中,有一道题:
题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
这是一道经典的for循环遍历的题,其中涉及到几个数学运算符,先来复习下:
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 - 两个对象相加 | a + b 输出结果 30 |
- | 减 - 得到负数或是一个数减去另一个数 | a - b 输出结果 -10 |
* | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | a * b 输出结果 200 |
/ | 除 - x除以y | b / a 输出结果 2 |
% | 取模 - 返回除法的余数 | b % a 输出结果 0 |
** | 幂 - 返回x的y次幂 | a**b 为10的20次方, 输出结果 100000000000000000000 |
// | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
然后就是怎么实现的问题了:
1 from math import floor 2 for i in range(100,1000): 3 H = floor(i/100) 4 T = (floor(i/10))%10 5 N = i%10 6 if i==H**3+T**3+N**3: 7 print(i,‘\t’,H**3,T**3,N**3)
执行结果为:
153 1 125 27
370 27 343 0
371 27 343 1
407 64 0 343
但是查看别人写的代码发现,执行的结果为空,这是为何呢?是因为没有导入math模块吗?
for n in range(100,1000): i=n/100 j=n/10%10 k=n%10 if n==i**3+j**3+k**3: print(n)
我们可以一步步来分析下,输出为空。。。
在代码中间输出i的值执行看看结果
for n in range(100,1000): i=n/100 j=n/10%10 k=n%10 print(i) if n==i**3+j**3+k**3: print(n)
执行查看就会发现i这个值是浮点数,所以后面的计算就会出错,且不是我们需要的数值。那么怎么办呢?python中除法取整有以下几个方法:
内置函数round(),向上取整math.ceil(),向下取整math.floor(),如果你不想使用上诉几个方法,你可以这样:
for n in range(100,1000): i=int((n/100)) j=int(n/10)%10 k=n%10 if n==i**3+j**3+k**3: print(n)
这样,就可以正确输出了。。。
bingo.