010问题:
什么是水仙花数?水仙花数是指一个 n 位正整数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)。
要求:打印输出所有的三位数"水仙花数"。
流程分析:
思路1:
1、设置范围:三位数的水仙花i,将i从100到999之间循环找书
2、由于i是整数,将i转为字符串,然后将i的百位数、十位数、个位数(x,y,z)分别取出并再次转换为整数
3、设定条件:
if pow(x,3)+pow(y,3)+pow(z,3)==i
4、如果条件满足就打印i
思路2:
1、现将这三位数的百位i、十位j、个位k分别从(1,9)、(0,9)、(0,9)这三个范围中枚举
2、判定条件:
if pow(i,3)+pow(j,3)+pow(k,3)==i*100+j*10+k
3、如果条件满足就打印ijk
代码分析:
代码1
for i in range(100,1000): x,y,z=map(int,str(i)) if pow(x,3)+pow(y,3)+pow(z,3)==i: print(i) #输出结果 153 370 371 407
代码2
for i in range(1,10): for j in range(10): for k in range(10): if i**3+j**3+k**3==i*100+j*10+k: print(i,j,k) #输出结果 1 5 3 3 7 0 3 7 1 4 0 7
题目反思:
1、思路1需要注意如和将整数转为字符串,因为字符串是有顺序的,然后再转为整数,用到的map函数
2、思路2和枚举法很相似,幂次方也可以用pow函数来代替
新学知识点:
1、一道题的两种不一样的思路,思路1是我想出来的,思路2是题目的标准答案,我的思路可能转换起来比较麻烦,标准代码一目了然
2、pow有两种用法
- 用法1
import math math.pow( x, y )
- 用法2
pow(x,y[,x])
- x -- 数值表达式。
- y -- 数值表达式。
- z -- 数值表达式。
函数是计算x的y次方,如果z在存在,则再对结果进行取模,其结果等效于pow(x,y) %z
注意:pow() 通过内置的方法直接调用,内置方法会把参数作为整型,而 math 模块则会把参数转换为 float。
3、map(function, iterable, ...)
- function -- 函数,有两个参数
- iterable -- 一个或多个序列
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]) #相当于 [3, 7, 11, 15, 19]
Mark on 2018.04.13