今天学习,看见有个让做水仙花数的题
肯定先百度啊,什么是水仙花数,百度了下,明白了
例如:一个三位数的水仙花数,是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)。
以此类推,可以有4+为以上的水仙花数,先别急,做一个固定3位数的
i = 521
a = i%1000//100
b = i%100//10
c = i%10
print(a)
print(b)
print(c)
忘记了一些东西,先试试,打印了下,还可以,就写出了一个三位数的水仙花
num = 3
for i in range(pow(10,num-1),pow(10,num)):
a = i%1000//100
b = i%100//10
c = i%10
if pow(a,3)+pow(b,3)+pow(c,3) == i:
print(i)
这里就学习了pow函数,原来是求N次的幂,可以,学到一招
那继续,问题来了
怎么去把输入是位数去固定名称了,例如4位数,就是abcd四个参数,输入3,d就白定义了,万一输入7,又不够,继续想
后面想到可以用list储存,这样用下标循环就可以了
想了下,用这个方法,要定义个函数,来取余
百度了下,发现了一个师兄的博客,地址是
代码是:
'''代码,有个地方复制不到,就打省略号
def f(n):
list=[]
for i in range(pow(10,n-1),pow(10,n)):
list=map(int,str(i))
sum = 0
for k in range(0,len(list)):
sum=sum+pow(list[k],n)
if sum==i:
print i
if __name__=="__main__":
n=int(raw_input("请输入正整数的位数:"))......
'''
看不懂啊,这神马哦,那继续研究
先看代码问题,可能是老版的python,我用的是python 3.7,代码有误啊
print i 需要加个括号,raw_input不知道什么,估计是input,自己敲就省略了
然后捣鼓代码
后面发现原来这么强的list函数,map就拆分了,各位新手建议自己百度
语法
map(function, iterable, ...)
- function -- 函数
- iterable -- 一个或多个序列
然后自己一步一步调试啊,基本上就成了
其中,遇见了以下几个问题:
1.unsupported operand type(s) for -: 'str' and 'int'
这个是定义num的时候,没有加int,直接放在range里面,就提示了,后面把num控制成int就行了:
num = int(input("输入一个位数,求水仙花数:"))
2.'map' object is not subscriptable
最难的就是这个了,研究了好久,调试了十几分钟,才明白,map是不能直接加减的,然后继续想解决办法,后面看类型,然后把list_s 重新用list包装,即
list_s = list(list_s)
然后终于搞定了,当然,后面取list[k],也int了
然后附上全部代码:
num = int(input("输入一个位数,求水仙花数:"))
list_s = []
for i in range(pow(10,num-1),pow(10,num)):
list_s = map(str, str(i))
list_s = list(list_s)
sum = 0
for k in range(0, num):
sum = sum + pow(int(list_s[k]), num)
if sum == i:
print(i)
当然,在num > = 7,之后,计算数值太大,机器吃不消哈