我是一名業余 Python 編碼員,試圖為Project Euler Digit Sum 問題找到一個有效的解決方案。我的代碼回傳正確的結果,但對于 1234567890123456789 這樣的大整數效率低下。我知道效率低下在于我的sigma_sum函式中存在“for”回圈。
我嘗試了各種替代解決方案,例如將值加載到一個 numpy 陣列中,但使用這種方法會導致記憶體不足且具有大整數。我渴望學習更有效的解決方案。
import math
def sumOfDigits(n: int) :
digitSum = 0
if n < 10: return n
else:
for i in str(n): digitSum = int(i)
return digitSum
def sigma_sum(start, end, expression):
return math.fsum(expression(i) for i in range(start, end))
def theArguement(n: int):
return n / sumOfDigits(n)
def F(N: int) -> float:
"""
>>> F(10)
19
>>> F(123)
1.187764610390e 03
>>> F(12345)
4.855801996238e 06
"""
s = sigma_sum(1, N 1, theArguement)
if s.is_integer():
print("{:0.0f}".format(s))
else:
print("{:.12e}".format(s))
print(F(123))
if __name__ == '__main__':
import doctest
doctest.testmod()
uj5u.com熱心網友回復:
嘗試解決不同的問題。
將 G(n) 定義為字典。它的鍵是表示數字和的整數,它的值是所有正整數的總和 < n ,其數字和是鍵。所以
F(n) = sum(v / k for k, v in G(n 1).items())
[使用 < 代替 ≤ 可簡化以下計算]
給定G(a)任何值的值,您將如何計算G(10 * a)?
這為您提供了一種很好的簡單方法來計算G(x)任何 x 值。遞回計算G(x // 10),使用它來計算 value G((x // 10) * 10),然后手動添加 range 中剩余的幾個元素(x // 10) * 10 ≤ i < x。
從G(a) 到G(10 * a)有點棘手,但也不過分。如果你的代碼是正確的,你可以使用計算G(12346)作為一個測驗用例,看看你是否得到了正確的答案F(12345)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/435880.html
