【问题标题】:Return an array containing prime numbers whose product is x返回一个包含素数的数组,其乘积为 x
【发布时间】:2018-04-20 08:16:16
【问题描述】:

我迷路了。我的功能适用于某些情况,但有些情况不适用。例如,提供数字 110019 它应该返回一个数组 [13,13,3,7,31] 而不是...

def primeFactorization(x):
    i=2
    array=[]
    for i in range(i,x+1):
        if x % i == 0:
            j=2
            for j in range(j,x+1):
                if i % j == 0:
                i=j
            array.append(i)
            product_value=1
            for j in array:
                product_value=j*product_value
                if product_value == x:
                    array.sort()
                    return array
    return []

【问题讨论】:

  • 您使用的不是数组,而是列表。
  • 您要实现的逻辑是什么?你有算法的来源吗?它实际上没有任何意义。
  • 在迭代列表时修改列表总是一个坏主意,不要在 for j in array 循环中使用 array.sort
  • 我正在尝试找出数字的所有因素。我的第一个循环是遍历从 2 到我们试图为其寻找因子的值的每个值。第二个循环是让我们说 4 变成 2、6 变成 2、9 变成 3。任何作为因子的数字我们都通过再次从 2 开始并循环遍历数字将其变成素数
  • 明白。不幸的是,这不起作用。对于除以 x 的每个数字 i,包括 x 本身,您确定除以 i 的最低素数 j。这不会产生x 的素数分解。行一个素因数分解的基本算法研究。

标签: python algorithm list primes


【解决方案1】:

问题是你的逻辑太复杂了,你自己被绊倒了。特别是,您多次识别因素。结果,当您遍历嵌套循环时,因子列表(您将其命名为 array)中有一些因子的多个副本,因此该列表的乘积绝不是原始数字。因此,您永远不会对数组进行排序和返回,而是退出到函数的最后一行,返回空列表。

尝试使用已知正确的方法之一,而不是此算法。最重要的是,当您找到一个因子并将其放入列表中时,将x 除以因子,然后继续分解商。您的逻辑问题源于对原始数字的处理,然后尝试确定您找到的因子的新组成部分。

这是带有一些基本跟踪打印的代码:

def primeFactorization(x):
    i=2
    array=[]
    for i in range(i,x+1):
        if x % i == 0:
            print x, "divisible by", i
            j = 2
            for j in range(j,x+1):
                if i % j == 0:
                    print i, "divisible by", j, "resetting"
                    i = j
            array.append(i)
            print "New factor", array
            product_value = 1
            for j in array:
                product_value = j*product_value
                if product_value == x:
                    array.sort()
                    return array
    return []

print primeFactorization(110019)

输出:

110019 divisible by 3
3 divisible by 3 resetting
New factor [3]
110019 divisible by 7
7 divisible by 7 resetting
New factor [3, 7]
110019 divisible by 13
13 divisible by 13 resetting
New factor [3, 7, 13]
110019 divisible by 21
21 divisible by 3 resetting
New factor [3, 7, 13, 3]
110019 divisible by 31
31 divisible by 31 resetting
New factor [3, 7, 13, 3, 31]
110019 divisible by 39
39 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3]
110019 divisible by 91
91 divisible by 7 resetting
New factor [3, 7, 13, 3, 31, 3, 7]
110019 divisible by 93
93 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3]
110019 divisible by 169
169 divisible by 13 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13]
110019 divisible by 217
217 divisible by 7 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7]
110019 divisible by 273
273 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3]
110019 divisible by 403
403 divisible by 13 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13]
110019 divisible by 507
507 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3]
110019 divisible by 651
651 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3]
110019 divisible by 1183
1183 divisible by 7 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7]
110019 divisible by 1209
1209 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3]
110019 divisible by 2821
2821 divisible by 7 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7]
110019 divisible by 3549
3549 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7, 3]
110019 divisible by 5239
5239 divisible by 13 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7, 3, 13]
110019 divisible by 8463
8463 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7, 3, 13, 3]
110019 divisible by 15717
15717 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7, 3, 13, 3, 3]
110019 divisible by 36673
36673 divisible by 7 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7, 3, 13, 3, 3, 7]
110019 divisible by 110019
110019 divisible by 3 resetting
New factor [3, 7, 13, 3, 31, 3, 7, 3, 13, 7, 3, 13, 3, 3, 7, 3, 7, 3, 13, 3, 3, 7, 3]
[]

【讨论】:

  • 所以现在我们得到了所有的因素。显然是重复的。但是然后我们想尝试找到所有这些数字,我们可以将什么串在一起形成一个乘积为 x 的数组
  • @BrianGurka,因为每个正整数只有一个素因数分解,这些因数的乘积是原始数字,只有一个解。
【解决方案2】:

一些问题:

  • j 上的循环毫无用处。里面的if唯一一次是真的,是i == j,因为在那之后j只会增加。此外,赋值 i = j 没有任何改变,因为当这种情况发生时它们已经相等

  • 您的代码永远不能将相同的值附加两次,但这可能是必要的。

  • 每次从头开始计算乘积是浪费时间。您应该在添加新因子时逐步执行此操作。最好从相反的方向工作,并根据您发现的每个因素 x。这样你就可以避免找到非主要因素。

  • 对列表进行排序没有用处,因为i 在您的代码中增加,所以当您将i 附加到列表时,列表将始终保持排序状态。

这是它的工作原理:

def primeFactorization(x):
    lst = []
    i = 2
    while x > 1:
        while x % i == 0:
            lst.append(i)
            x //= i
        i += 1
    return lst

print (primeFactorization(110019))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多