我想知道,如何在沒有給定數字本身的情況下將 python 中數字的所有可能除數相加。例如,數字 36 的所有可能除數是 1、2、3、4、6、9、12 和 18。當你把它們加起來時,你應該得到總共 55。我想知道如何得到這些帶有 while 回圈的除數。
我嘗試了以下代碼:
def sum_divisors(n):
sum = 0
divisor = 2
while n % divisor == 0:
if n == 0:
return 0
print(n / divisor)
divisor = 1
print(sum_divisors(36))
當我執行此代碼時,我只得到數字 18、12 和 9。在這些數字之后,我得到“無”。我認為我的問題是,當我執行此代碼時,只要條件為“真”,除數就會加 1。但是當程式必須除以 36 / 5 時,余數為 1,并且代碼將不再被執行,因為條件為“假”。因此,我嘗試使用以下代碼解決此問題:
def sum_divisors(n):
sum = 0
divisor = 2
while n % divisor == 0:
if n == 0:
return 0
if n % divisor == 1:
divisor = 2
print(n / divisor)
divisor = 1
print(sum_divisors(36))
但是這段代碼也不起作用。你有一些提示我可以解決這個問題嗎?我只想得到提示而不是建議的解決方案。我知道我仍然需要找到有關如何添加所有內容的代碼。但我一定能解決這個問題。;)
uj5u.com熱心網友回復:
我強烈建議使用生成器方法。我們生成所有可能的除數,然后將它們相加。它還將允許您獲得各個除數:
import math
from typing import Iterator
def iter_divisors(n: int, /) -> Iterator[int]:
"""Iterate over the divisors of a given integer."""
if n == 0:
yield 0
return
sqrt = math.sqrt(n)
# math.ceil explanation:
# If sqrt is a whole number, we check everything until sqrt.
# Else, we check everything until the closest integer from below.
for i in range(1, math.ceil(sqrt)):
if n % i == 0:
yield i
yield n // i
# If the sqrt is whole, yield it only once (6 instead of 6,6 in 36)
if sqrt.is_integer():
yield int(sqrt)
然后你可以總結一下:
>>> print(sum(iter_divisors(36)))
91
請記住,它包括 1 和 n。如果需要,您可以減去它們:
>>> print(sum(iter_divisors(36)) - 36)
55
uj5u.com熱心網友回復:
for回圈怎么樣:
def sum_divisors(n):
ds = 1
for i in range(2, (n//2) 1):
if n % i == 0:
ds = i
return ds
print(sum_divisors(36))
輸出:
55
uj5u.com熱心網友回復:
代碼:
def sum_divisors(num):
Sum=0
n=1
while n<=(num//2):
if num%n==0:
Sum = n
n = 1
return Sum
print(sum_divisors(36))
輸出:
55
uj5u.com熱心網友回復:
這將適用于您的情況。
def sum_divisors(n):
sum = 0
divisor = 1
while divisor<n:
if n%divisor == 0:
sum = divisor
divisor = 1
return sum
print(sum_divisors(36))
uj5u.com熱心網友回復:
一種可能性是首先單獨獲取一個串列(在這種情況下,我將此方法稱為'divisor_nums')。它包含所有可能的數字,例如可以除以“36”。
# // Get all possible numbers that can be devided
def divisor_nums(num: int) -> list:
return [x for x in range(num) for y in range(num) if x * y == num]
# ... 2, 3, 4, 6, 9, 12, 18 (with 36)
在第二部分中,我使用計數器迭代上面串列中的所有數字。在比較中,list[i] == list[i] = 0。好吧,也許不是最好的選擇,但可能是眾多選擇之一。
def sum_divisors(num):
sum = 0
i = -1
lst = divisor_nums(num)
while lst[i] % lst[i] == 0:
sum = lst[i]
i = 1
if i >= len(lst)-1:
break
return sum
print(divisor_nums(36))
print(sum_divisors(36))
PS:該divisor_nums()功能只是可選的。您也可以直接在sum_divisors函式中包含此串列
uj5u.com熱心網友回復:
您可以調整素數分解演算法來構建一組除數(如果需要,將數字本身從結果中排除):
def getDivs(N):
factors = {1}
maxP = int(N**0.5) # largest possible prime factor
p,inc = 2,1 # candidate divisors (primes)
while p <= maxP: # up to √(remaining N)
while N%p==0:
factors.update([f*p for f in factors]) # expand divisors
N //= p # reduce N
maxP = int(N**0.5) # new max prime
p,inc = p inc,2 # next divisor
if N>1:
factors.update([f*N for f in factors]) # ultimate prime
return factors - {max(factors)} # exclude number itself
輸出:
getDivs(36)
{1, 2, 3, 4, 6, 9, 12, 18}
sum(getDivs(36))
55
getDivs(1001001001)
{1, 7, 762377, 11, 13, 77000077, 143, 91000091, 1313, 1415843,
9901, 69307, 1000001, 707, 7000007, 128713, 11000011, 77,
13000013, 143000143, 1111, 91, 7777, 101, 9191, 1001, 14443,
101101, 108911, 9910901, 900991}
sum(getDivs(1001001001))
356444375
如果您不需要自己列出除數而只查找它們的總和,則可以在 O(√N) 時間內得到它的理解:
def divSum(N):
return sum(sum({d,N//d}) for d in range(2,int(N**0.5) 1) if N%d == 0) 1
divSum(36) # 55
divSum(1001001001) # 356444375
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/416338.html
標籤:
上一篇:課堂上的初學者python
