首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何求一个数的所有因子的和,而不包含它

如何求一个数的所有因子的和,而不包含它
EN

Stack Overflow用户
提问于 2020-05-09 03:41:32
回答 3查看 13.6K关注 0票数 1

求一个数的所有因子的和,不包括被除的那个特定的数。

例如,如果我们想要找到数字6的除数,它们应该是1,2,3。数字6应该包括在内,因为它是一个除数,但对于这种情况,我们不考虑它。

注意:-数字3和4不包括在内,因为当你将数字6除以数字3时,会有一个余数。

除数是一个除以另一个没有余数的数。

代码语言:javascript
运行
复制
def sum_divisors(n):
    sum =  0
    # Return the sum of all divisors of n, not including n
    return sum

print(sum_divisors(0)) # 0
print(sum_divisors(3)) # Should sum of 1 # 1
print(sum_divisors(36)) # Should sum of 1+2+3+4+6+9+12+18 # 55
print(sum_divisors(102)) # Should be sum of 2+3+6+17+34+51 # 114
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-09 04:20:44

您可以使用组合的filter()和lambda()函数

代码语言:javascript
运行
复制
num = 36
div_sum = sum(list(filter(lambda div : num % div == 0 , range(1, num))))

# divisors :  [1, 2, 3, 4, 6, 9, 12, 18]
# divisors sum :  55 

print('divisors sum : ', div_sum)
票数 0
EN

Stack Overflow用户

发布于 2020-05-09 04:04:24

我想我明白了:

代码语言:javascript
运行
复制
def sum_divisors(n):
    return sum([i for i in range(1, n)
                if n % i == 0])

print(sum_divisors(0))
print(sum_divisors(3)) # Should sum of 1
print(sum_divisors(36)) # Should sum of 1+2+3+4+6+9+12+18
print(sum_divisors(102)) # Should be sum of 2+3+6+17+34+51

输出

代码语言:javascript
运行
复制
0
1
55
114
票数 1
EN

Stack Overflow用户

发布于 2020-05-09 04:14:04

我们需要先找到数字的除数,然后再求和。找出一个数是否是另一个数的除数非常简单:

代码语言:javascript
运行
复制
if x % y == 0:
  is_divisor = True

Modulo -%-返回除法的余数。9%2=1.10%3=1。但是,我们需要知道要检查哪些数字。我们可以遍历每个数字直到我们的输入:

代码语言:javascript
运行
复制
for i in range(n):
  if n % i == 0:
    is_divisor = True

...but,这太多了。例如,我们知道n的最高可能因子不是n本身,如果n是偶数,则是1/2n,如果不是偶数,则更低。相反,让我们专注于获取每一对,然后检查是否应该继续。我们还需要存储所有这些数字,所以让我们创建一些列表:

代码语言:javascript
运行
复制
lower_divisors = []
upper_divisors = []

我们想知道我们当前最高的下除数和最低的最高除数是什么,也知道从哪里开始。我们可以用1填充较低的除数列表,用n填充最高的除数列表。我们可以考虑稍后删除n。

代码语言:javascript
运行
复制
lower_divisors = [1]
upper_divisors = [n]

continu = True

while continu:
  # Let's get the last item in each list
  highest_low = lower_divisors[-1]
  lowest_high = upper_divisors[-1]

  for i in range(highest_low + 1, lowest_high):
    if n % i == 0:
      lower_divisors.append(i)
      upper_divisors.append(n // i)
      break
  continu = False

# If we've left the loop, we have all of our divisors.
lower_sum = sum(lower_divisors)
higher_sum = sum(upper_divisors) - n   #Gotta take it back out!
sm = lower_sum + higher_sum
return sm

这应该是一种快速实现目标的方法,而不会让你的计算机工作更困难-但是...这需要更多的步骤来编写。我写了更多的步骤,以清楚我正在做什么,并使其具有可读性,但它肯定可以修剪很多。

在运行代码时,当n超过8位时,循环遍历从1到n的每个数字的简单方法开始真正积累起来。在我的机器上,9位数大约需要12-16秒。上述较长的方法在不到1/10秒的时间内返回32位的n值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61686862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档