我正在通过这个Kata工作,虽然我已经查看了解决方案但没有一个非常相似我的回答我的问题。
问题文本:数字89是第一个具有多个数字的整数,它满足在此kata标题中部分引入的属性。说" Eureka&#34 ;?的用法是什么?因为这个总和给出了相同的数字。
实际上:89 = 8 ^ 1 + 9 ^ 2
拥有此属性的下一个数字是135。
再次查看此属性:135 = 1 ^ 1 + 3 ^ 2 + 5 ^ 3
我们需要一个函数来收集这些数字,它们可以接收两个整数a,b,它定义范围[a,b](包括)并输出满足上述属性的范围内的排序数字列表。
def sum_dig_pow(a, b): # range(a, b + 1) will be studied by the function
# your code here
lst = []
n = 1
tot = 0
for i in range(a,b):
if i > 9:
spl = str(i).split()
for item in spl:
tot += int(item) ** n
n += 1
if tot == i:
lst.append(i)
else:
lst.append(i)
return lst
测试正在返回" [1,2,3,4,5,6,7,8,9,10]应该等于[1,2,3,4,5,6,7,8] 9,89]"。 我无法弄清楚为什么它通过10而没有追加89.我确信还有更有效的方法来做到这一点但是我还在学习所以想要在循环,条件等的基础知识
感谢大家的反馈!我知道枚举非常有用bc ive过去曾使用它但我无法概念化它在这里有用的方式>。< 。这里有适合我的解决方案,PLZ评论清理等等!!
def sum_dig_pow(a, b): # range(a, b + 1) will be studied by the function
lst = []
for i in range(a,b+1):
if i > 9:
s = sum_dig(i)
if s == i:
lst.append(i)
else:
lst.append(i)
return lst
def sum_dig(num):
n = 1
tot = 0
for dig in str(num):
tot += int(dig)**n
n+=1
return tot
答案 0 :(得分:1)
此行不正确:
spl = str(i).split()
split
方法默认会在空格上拆分字符串并返回列表。因此传递i=10
会返回spl = ['10']
,这是一个包含一个元素的列表。相反,只需迭代字符串中的每个数字。
for item in str(i):
...
跟进:您可以使用enumerate
计算每个数字的索引来缩短代码。
def sum_dig_pow(a,b):
return [sum(int(y)**(i+1) for i,y in enumerate(str(x))) for x in range(a,b)]
答案 1 :(得分:0)
不要花费大量时间将数字从数字转换为字符串并返回,而是尝试使用算术。要迭代数字n
的数字,取n
模10(得到最低有效数字)然后除以10(剥离最低有效数字)。例如,123的数字(反向顺序)为[(123%10),(12%10),(1%10)]
在功能方面考虑它,首先得到数字:
def digits_of_n(n):
result = []
while n > 0:
result.append(n % 10)
n = n / 10 # in python 3, use 3 // 10 for integer division
return reversed(result) # reverse list to preserve original order
然后获得权力的总和:
def sum_of_ith_powers(numbers):
result = 0
for i, n in enumerate(numbers): # the digits are ordered most-significant to least, as we would expect
result += n ** 1
return result
现在您可以致电sum_of_ith_powers(digits_of_n(n))
并获得答案。如果您愿意,可以为该操作命名:
def sum_of_digit_powers(n):
return sum_of_ith_powers(digits_of_n(n))
然后你可以命名解决kata的函数:
def solve_kata(a, b):
return [sum_of_digit_powers(n) for n in range (a, b)]
答案 2 :(得分:0)
您可以使用generator
,sum
和enumerate
来简化代码,例如:
def sum_dig_pow(a,b):
for k in range(a,b+1):
if k > 9:
number_sum = sum(int(j)**i for i,j in enumerate(str(k), 1))
if k is number_sum:
yield k
else:
yield k
print(list(sum_dig_pow(1,10)))
print(list(sum_dig_pow(1,90)))
print(list(sum_dig_pow(1,10000)))
print(list(sum_dig_pow(10,1000)))
print(list(sum_dig_pow(1,900000)))
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175]
[89, 135, 175]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175]