取一个数字并对其数字求和



我正在研究这个 Kata,尽管我已经查看了解决方案,但没有一个与我的解决方案非常相似,无法回答我的问题。

问题文本:数字 89 是第一个具有多个数字的整数,它满足此 kata 标题中部分引入的属性。说"尤里卡"有什么用?因为这个总和给出了相同的数字。

有效: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。我相信也有更有效的方法可以做到这一点,但我仍在学习,所以想研究循环、条件等的基础知识。

此行不正确:

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)]

与其花费大量时间将事物从数字转换为字符串再转换回来,不如尝试使用算术。要遍历数字n的数字,取n模十(得到最不重要的数字),然后除以十(去掉那个最不重要的数字)。例如,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)]

您可以使用generatorsumenumerate来简化代码,如以下示例所示:

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]
li = []
def sum_dig_pow(a, b):
for i in range(a, b+1):
sum1 = 0
for ind, val in enumerate(str(i), 1):
sum1 += pow(int(val), int(ind))
if i == sum1:
li.append(i)
return li
print(sum_dig_pow(1, 11))

相关内容

  • 没有找到相关文章

最新更新