<p>我做了与@techguy相同的假设,尽管我处理问题的方式不同。我选择使用递归方法而不是迭代方法,因为对于这类问题来说,这更自然。在</p>
<p>如果我们正在计算加法阶段发生的进位,那么我们需要将用于计数加法进位的逻辑封装在一个方法中,如下所示:</p>
<pre><code>def count_addition_carries_rec(nums, answer=0, carries=0):
dig_count = max(len(str(nums[0])), len(str(answer)))
carries_list = [0]
new_answer = ''
# convert to string, apply left-padding, and reverse
rnums = [str(x).zfill(dig_count)[::-1] for x in [nums[0], answer]]
for i in range(dig_count):
dig_sum = str(sum([int(num[i]) for num in rnums]) + carries_list[i])
if i < dig_count - 1:
new_answer = dig_sum[-1] + new_answer
carries_list.append(int(dig_sum[:-1].zfill(1)))
else:
new_answer = dig_sum + new_answer
carries_list = [car for car in carries_list if car != 0]
if len(nums) == 1:
# If this is the last number in the list,
# return the answer and the number of carries that
# occurred in the current as well as previous operations.
return int(new_answer), carries + len(carries_list)
else:
# if there are more numbers in the list,
# repeat the operation with a sublist, consisting of the next
# number onwards, passing the current sum (new_answer) and
# the current count of carries
return count_addition_carries_rec(nums[1:],
new_answer,
carries + len(carries_list))
</code></pre>
<p><code>count_addition_carries_rec</code>方法是通用的,因为它可以接受2个以上的整数。nums参数是一个列表,该方法期望它的长度为2或更长。在</p>
<p>计算乘法进位的方法如下:</p>
^{pr2}$
<p><code>count_multiplication_carries_rec</code>不像加法方法那样通用,但是可以很容易地修复它。您可以创建一个一次用2个数字调用<code>count_multiplication_carries_rec</code>的辅助方法,也可以修改当前实现以处理任意数量的整数。在</p>
<p>使用这两种方法的示例:</p>
<pre><code>>>> count_addition_carries_rec([99,99])
(198, 1)
>>> count_addition_carries_rec([17, 17, 17])
(51, 2)
>>> count_multiplication_carries_rec(15,15)
(225, 2)
>>> count_multiplication_carries_rec(657,34)
(223380, 6)
</code></pre>
<p>如您所见,这些方法返回加法/乘法运算的结果以及执行该操作时发生的进位数。在</p>