今天学习,看见有个让做水仙花数的题

肯定先百度啊,什么是水仙花数,百度了下,明白了

例如:一个三位数的水仙花数,是指一个 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,之后,计算数值太大,机器吃不消哈