2017-03-06 27 views
1

我必須定義一個函數,其中:遞增while循環沒有在一些測試用例工作

與正整數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)< 15,2×2 = 4,(1 + 2 + 4) < 15,4×2 = 8,(1 + 2 + 4 + 8)= 15,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 

是什麼導致它成爲了嗎?

+0

你缺少一個'總==原始案件。你應該有'如果總數<= original:return 0'。 – Bakuriu

+0

我強烈地感到,如果你想要的話,可能還有一個O(1)或O(logn)的解決方案。 –

+0

@AbhishekJebaraj這個*是'O(log n)'解決方案,其中'n'表示值'total'。 – EvilTak

回答

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 
+0

雖然這以更簡潔的方式解決了問題,但它並沒有真正回答問題,也沒有幫助OP理解。 –

+1

是的,如果他是一名學生,想要學習並發現他的錯誤,這將不會有太大的幫助。但是如果他在工作,想要一些整潔的代碼和快速的回​​答,這將幫助他很多imo .. –

+1

是的,因爲無論如何這是一個很好的解決方案。 :-) –

2

你的問題是,你在每個循環迭代重新分配sumofdigits。您只需在每次迭代中添加multnumsumofdigitssumofdigits += multnum)。此外,您的環路條件需要固定爲sumofdigits < total,因爲您必須「返回到達所需的最小乘法次數以上給定的總數」。

+0

哦,那好吧。所以我必須刪除第一個sumofdigits = multnum + original,並使用sumofdigits + = multnum? TIA –

+1

@ Pritster5是的。 – EvilTak

1

由於您的代碼解決方案已經發布,並接受其他解決方案,請允許我提出以下,這是一個很好的使用Python> 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 
+0

我很喜歡這個解決方案,但不幸的是我沒有被允許在代碼中使用這些函數。 –