我遇到了一个奇怪的问题:
数字根函数如下所示:
digital_root(493193)
=> 4 + 9 + 3 + 1 + 9 + 3
=> 29 ...
=> 2 + 9
=> 11 ...
=> 1 + 1
=> 2我的回答是:
def digital_root(n):
k = 10
while k > 9:
k = reduce(lambda x,y: int(x)+int(y), list(str(n)))
return k我把k设为10,这样它就会直接进入循环。但这位在线法官表示,这花费了太多时间。
我尝试另一种解决方案:
def digital_root(n):
while n > 9:
n = reduce(lambda x,y: int(x)+int(y), list(str(n)))
return n然后问题解决了。我能搞清楚这两种密码有什么区别
顺便说一句,我用的是网上代码战法官。
发布于 2017-02-04 16:04:33
这里的问题是,您有一个无限循环,并且您的第一个解决方案不是慢的,而是错误的。
def digital_root(n):
k = 10
while k > 9:
k = reduce(lambda x,y: int(x)+int(y), list(str(n)))
return k第一个reduce给出29。因此,k > 9,它再次这样做,但由于您不是重新注入k,而是重用n,那么您将再次获得29。
第二种解决方案是正确的,因为它改变了&只要n大于9就重新注入它(如果是n <= 9,则不会进入循环,因为在这种情况下,数字根本身就是数字)。
编辑:对于这种特殊情况,您根本不需要reduce。该代码更清晰,而且可能更快:
def digital_root(n):
while n > 9:
n = sum(int(x) for x in str(n))
return n(在生成器理解中,n的所有整数转换数字之和)
发布于 2017-02-04 16:26:01
同样,您也可以这样做:
def reduce_root(num = 0):
if isinstance(num, int):
return [k for k in str(num)]
else:
raise Exception("input number must be an integer!")
def digital_root(num = 0):
number = reduce_root(num)
print("Number: {}".format(num))
while True:
if len(number) == 1:
break
else:
print("=> {}".format(" + ".join(k for k in number)))
s = sum(int(k) for k in number)
print("=> {}".format(s))
number = reduce_root(s)输出:
digital_root(100245)
Number: 100245
=> 1 + 0 + 0 + 2 + 4 + 5
=> 12
=> 1 + 2
=> 3https://stackoverflow.com/questions/42042359
复制相似问题