近期在學習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.