在某些测试用例

时间:2017-03-06 06:47:39

标签: python python-3.x math while-loop calculation

我必须定义一个函数:

  

从正整数original开始,继续乘以original   按n计算生成的所有倍数的总和,包括   original直到总和不再小于total。归还   达到或等于此值所需的最小乘法次数   给定的总数。

例如:

  1. multiply_until_total_reached (1,5,2)

    1 * 2 = 2,(1 + 2)<5,2 * 2 = 4,(1 + 2 + 4)> 5,需要2次乘法

  2. multiply_until_total_reached (1,15,2)

    1 * 2 = 2,(1 + 2)&lt; 15,2 * 2 = 4,(1 + 2 + 4)&lt; 15,4 * 2 = 8,(1 + 2 + 4 + 8) = 15,3次乘法

  3. 我当前的代码有效但在某些情况下返回的值会减1。在1,1038,2的情况下,我得到9乘法而不是10,但在1,15,2的情况下,我得到正确的数量(3)乘法。

    这是我的代码:

    def multiply_until_total_reached(original, total, n):
        if total < original:
            return 0
        elif total > original:
            sumofdigits = 0 #declares var to keep track of sum of digits to compare to total
            timesofmult = 0 #track how many multiplication operations
            while sumofdigits <= total + 1:
                multnum = original * n
                sumofdigits = multnum + original
                original = multnum
                sumofdigits = sumofdigits + multnum
                timesofmult = timesofmult + 1
            return timesofmult
    

    导致它关闭的原因是什么?

3 个答案:

答案 0 :(得分:2)

试试这个,更小更整洁。解释在评论中..

def multiply_until_total_reached(original, total, n):
        sum = original    #Initialize sum to original
        mult_no = 0

        while sum < total:       #Will auto return 0 if original>=total
            sum += original*n    #Add original * n
            original = original*n   #Update the new original
            mult_no += 1    #Increase multiplications by 1

        return mult_no

print multiply_until_total_reached(1,5,2)
print multiply_until_total_reached(1,15,2)
print multiply_until_total_reached(1,1038,2)

#Output
#2
#3
#10

答案 1 :(得分:2)

您的问题是您在每次循环迭代中重新分配sumofdigits。您只需在每次迭代(multnum)中将sumofdigits添加到sumofdigits += multnum。此外,您的循环条件需要固定为sumofdigits < total,因为您必须&#34;返回达到所需的最小乘法次数 < em>高于给定的总数。&#34;

答案 2 :(得分:1)

由于您的代码的解决方案已经发布,并且您接受其他解决方案,请允许我建议以下内容,这样可以充分利用Python&gt; s&gt; 3.2 accumulate()功能:

from itertools import accumulate, count

def multiply_until_total_reached(original, total, n):
    for i, result in enumerate(accumulate(original*n**c for c in count())):
        if result >= total: return i

assert multiply_until_total_reached(1,5,2) == 2
assert multiply_until_total_reached(1,15,2) == 3
assert multiply_until_total_reached(1,1038,2) == 10