【发布时间】:2014-03-11 16:28:39
【问题描述】:
我在 checkio.org 上试图解决这个问题:
给你一个两位或多位数字 N。对于这个任务,你应该找到 X 的最小正数,使其数字的乘积等于 N。如果 X 不存在,则返回 0。 让我们来看看这个例子。 N = 20。我们可以将这个数字分解为 2*10,但 10 不是数字。我们也可以将其分解为 4*5 或 2*2*5。 2*2*5 的最小数字是 225,对于 4*5 -- 45。所以我们选择 45。
我创建了对整数进行因式分解的递归函数,并且我将 factoredList 传递给另一个名为“groupIt”的递归函数,以查找作为因式分解整数乘积的最小整数。
函数如下:
def groupIt(digits):
tempList = []
if len(digits)>1:
for z in range(0,len(digits)-1):
if digits[z]*digits[z+1]>=10:
toStore=""
for k in range(0,len(digits)):
toStore+=str(digits[k])
return int(toStore)
else:
digits.append(digits.pop(z+1)*digits.pop(z))
digits.sort()
tempList.append(groupIt(digits))
else:
return digits[0]
tempList.sort()
return tempList[0]
对于整数 '20',分解后的列表是 2 x 2 x 5。当我在 [4,5] 上递归调用 groupIt 时,“len(digits)-1” = 1,所以 z 从范围 (0 ,1)。
据我了解,z 应该仅为 0,因为它不包括范围内的最后一个整数,但 z 在 [4,5] 的同一个 for 循环中最终会变为 1。
如果我将“for z in range(0,len(digits)-1)”替换为“for z in range(0,1)”,则代码有效,因此问题似乎在那里孤立。
想法?
【问题讨论】:
-
请考虑使用首选的
for digit in digits:而不是for z in range(0, len(digits)-1): -
如果我只想迭代 len(digits)-1 次,这可行吗?
-
当我尝试使用
groupIt('20')运行您的代码时,我得到了TypeError: can't multiply sequence by non-int of type 'str'的if digits[z]*digits[z+1]>=10:行。 -
for digit in digits[:-1] -
啊,你需要用 groupIt([2,2,5]) 运行它。我有一个单独的、未包含的函数,可将“20”分解为 [2,2,5]。