【问题标题】:how to find divisors of a given number in python and append them to a list?如何在python中找到给定数字的除数并将它们附加到列表中?
【发布时间】:2021-07-12 16:29:03
【问题描述】:

我正在尝试查找给定数字的所有除数并将它们附加到列表中。但是,当我尝试附加它们时,程序还会附加它迭代的数字,并将适当的除数附加在列表的末尾。如何避免附加不正确的除数?我的代码和输出如下:

n=12
lis=[]
for i in range(2, (n+1) ):
    for j in range(1,i):
        if i % j == 0:
            lis.append(j)

我的输出是:[1, 1, 1, 2, 1, 1, 2, 3, 1, 1, 2, 4, 1, 3, 1, 2, 5, 1, 1, 2, 3, 4、6]

我怎样才能得到以下输出:[1, 2, 3, 4, 6]

【问题讨论】:

  • 你只是想找到一个除数对吗?您现在拥有的代码不是找到 n 的除数,而是找到与每个 [1,i) 比较的所有数字 [2,n+1) 的除数。所以你要多次进行相同的比较。

标签: python list loops


【解决方案1】:

此代码存在严重缺陷。 i % j 真的是一个不相关的检查。如果我尝试创建一个接近您的答案,这将起作用:

n=12
lis=[1]
for i in range(2, (n) ):
    for j in range(1,i):
        if i * j == n:
            lis.append(i)
            lis.append(j)

然后您可以对其进行排序。但是这个内部循环很糟糕:它不会告诉你比n % i == 0 更多的信息,而且它的运行速度要慢得多。不涉及嵌套循环的更好答案是:

n=12
lis=[1]
for i in range(2, n):
    if n % i == 0:
        lis.append(i)

当然,这可以进一步改进:请注意,我们不需要检查任何大于一半的 n,因为没有大于 n / 2 的值将平均划分 n。在最好的情况下,如果你同时追加in // i,你只需要检查i从2到n的平方根。

【讨论】:

  • i % j 不是无关检查。运算符 % 检查除法的模数:w3schools.com/python/trypython.asp?filename=demo_oper_mod
  • @NataliaResende i % j == 0 如何告诉您这些值是否是n 的除数?
  • 如果 i % j 的乘积等于 0,这意味着存储在 j 中的数字是给定数字的除数:12/6=2 > 模 0 所以 6 是除数,但 12 /5 = 2 模数 2 然后 5 不是除数,那么它不应该附加到列表中
【解决方案2】:

我找到了以下解决方案

def sumPdivisors():
    n=int(input('Enter a number to find the sum of its divisors: '))
    lis=[]
    for i in range(2, (n+1) ):
        pass
    for j in range(1,i):
        if i % j == 0:
            lis.append(j)

    print("the sum of the proper divisors of {} if {}". 
format(n,sum(lis)))    
          
sumPdivisors()

【讨论】:

  • 这与@Kraigolas 发布的答案完全相同。顶部的无操作循环只是以可以想象的最不高效的方式将i 设置为等于n
【解决方案3】:

就目前而言,您正在比较以下内容

2%1
3%1
3%2
4%1
4%2
4%3
5%1
5%2
5%3
5%4
6%1
6%2
6%3
6%4
6%5
7%1
7%2
7%3
7%4
7%5
7%6
8%1
8%2
8%3
8%4
8%5
8%6
8%7
9%1
9%2
9%3
9%4
9%5
9%6
9%7
9%8
10%1
10%2
10%3
10%4
10%5
10%6
10%7
10%8
10%9
11%1
11%2
11%3
11%4
11%5
11%6
11%7
11%8
11%9
11%10
12%1
12%2
12%3
12%4
12%5
12%6
12%7
12%8
12%9
12%10
12%11

您可以看到您的脚本正在比较与 12 无关的数字。

编辑:

我刚刚在您的代码中添加了打印语句。

n=12
lis=[]
for i in range(2, (n+1) ):
    for j in range(1,i):
        print("{}%{}".format(i,j))
        if i % j == 0:
            lis.append(j)

【讨论】:

  • 抱歉,我是编程新手。不是很有经验,但这正是该程序所做的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-05
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-22
  • 2021-12-25
  • 2010-11-26
相关资源
最近更新 更多