水仙花数

用python写水仙花数

前几天上matlab的时候,老师布置的一道作业,用matlab写水仙花数,鉴于Blog主是学python的,所以就用了python写,写的时候偶然发现两个以前学习时候没有留意到的细节,所以特意写发个blog分享一下! 至于什么事水仙花数,呵呵,请善于利用搜索工具!下面介绍两种求三位数的水仙花数的python求法:




## 方法一:

1
2
3
4
5
6
7
8
9
10
11
import math
for q in range(1,10):
for w in range(10):
for e in range(10):
a = q**3
b = w**3
c = e**3
y = a + b + c
i = q*100 + w*10 +e
if i == y:
print i


## 方法二:

1
2
3
4
5
6
7
8
9
#_*_ coding:utf-8 _*_
import math
for i in range(100,999):
a = i/100 # 取百位
b = i%100/10 #取十位
c = i%10 #取个位
y = a**3 + b**3 + c**3
if i == y :
print i





理性分割线

第一种方法是我拿到题目之后就想到的,然后就很快地写了三个for循环,可是到运行的时候就出现问题了,后来我才明白问题很严重,严重到有可能把机器直接卡死在那!下面是我的第一次的代码:

1
2
3
4
5
6
7
8
9
10
11
import math
for q in range(1,10):
for w in range(10):
for e in range(10):
q = q**3
w = w**3
e = e**3
y = q + w + e
i = q*100 + w*10 +e
if i == y:
print i

细心的你们有没有发现什么问题呢?
找不到?回去认真看一下!
对了,就是循环体里面有问题,变量 q w e 循环后的立方的值并没有用其他变量代替,而是直接用了!用了!了!这样做的话,第一次循环后就和 for x in range(10) 冲突了,但冲突了会出错吧,可问题来了,并不会出错!因为x立方后已经超出range(10)的范围了,会一直循环下去,而且数值会以立方递进的形式继续变大,直到撑爆运行内存。。。这就很尴尬了,好运的话,会提示超出运行内存,运气差的话,就可以准备重启吧。
所以,在for循环里特别要注意循环的值!这很关键!

至于第二个方法是后来老师公布matlab答案的时候的,主要的问题就在于怎样将三位数的每一个位单独取出来。需要用到了两个工具就是 % / 这两个,前者求余,后者求商,怎样用也很简单,还有规律,看客们大可以自己去摸索!


声明:

欢迎转载,转载时请注明出处
JacobYRJ