【问题标题】:Euler 3 Python. Putting the prime numbers into a list欧拉 3 Python。将素数放入列表
【发布时间】:2015-05-04 14:40:02
【问题描述】:

我对 python 还是很陌生,我正在尝试将 600851475143 中的所有素数放入一个列表中。但是,我不断在列表中获得随机的数字,而不是素数。我不确定我哪里出错了。感谢您的宝贵时间

import math
factors_list = []
prime_factors = []

def number_factors(s):
    s = int(math.sqrt(s))
    for num in range(2, s):
        for i in range(2, num):
            if (num % i) == 0:
                factors_list.append(num)
            else:
                prime_factors.append(num)

number_factors(600851475143)

print factors_list
print prime_factors

【问题讨论】:

  • 这个算法有很大的问题。建议:在您的循环中添加一些打印语句,以查看您的算法产生的数字。在您确定您的代码在您可以手动检查的小数字上正常工作之前,不要尝试处理这个巨大的数字。在相关说明中,您可能会发现使用铅笔和纸来遵循您的算法很有帮助。

标签: python math primes prime-factoring


【解决方案1】:

目前您每次都附加到prime_factor if (num % i) == 0。因此,例如,如果num=12(不是素数)和i=5,您将追加到prime_factor

相反,你应该只在它根本没有没有个除数的情况下追加,而不是一个单一的数字不能均匀除数。

不过,我会提前警告您,这个问题不仅与计算素数有关,而且 600851475143 是一个非常大的数字。因此,您可能应该让您当前的代码作为学习练习,但您需要重新考虑获得完整解决方案的方法。

【讨论】:

  • 处理非常大的数字的最佳方法是什么?到目前为止,我只在课堂上了解了 range 和 xrange
  • 总的来说,我认为帮助解决方案是违背欧拉问题的目标的。我在这里提供帮助是因为这是一个与问题核心无关的编程问题。在寻求下一步帮助之前,至少自己尝试一下。欧拉问题本来就很困难。
  • 600851475143 并没有那么巨大:它的最大质因数必须小于一百万,实际上小于 7000。的确,在语言仅限于 32 位整数,但即使使用相当简单的算法,在 Python 中进行因式分解也是轻而易举的事。
  • 我认为我们同意 OP 的基本解决方案目前正在做很多没有解决预期问题的工作。由于这是一个 Project Euler 问题,我宁愿不明确提及该代码 正在 实际在做什么。
【解决方案2】:

这里有一个更好的分解n的算法。我会用文字描述,所以你可以自己编写代码。

1) Set f = 2. Variable f represents the current trial factor.
2) If f * f > n, then n must be prime, so output n and stop.
3) Divide n by f. If the remainder is 0, then f is a factor of n,
     so output f and set n = n / f, then return to Step 2.
4) Since the remainder in the prior step was not 0, set f = f + 1
     and return to Step 2.

例如,要因子 13195,首先设置 f = 2;第2步的测试不满足,第3步的余数为1,所以在第4步设置f = 3并返回第2步。现在第2步的测试不满足,余数第3步中为1,所以第4步设置f = 4,返回第2步f = 5 并返回到第 2 步。

现在第2步的测试不满足,但是第3步的余数是0,所以5是13195的因数;输出5,设置n = 2639,返回步骤2。现在不满足步骤2的测试,步骤3的余数为4,所以步骤4设置f em> = 6 并返回步骤 2。现在步骤 2 中的测试不满足,步骤 3 的余数为 5,因此在步骤 4 中设置 f = 7 并返回步骤 2。

现在第 2 步的测试不满足,但是第 3 步的余数是 0,所以 7 是 2639 的因数(也是 13195 的因数);输出7,设置n = 377,返回步骤2。现在不满足步骤2的测试,步骤3的余数为6,所以步骤4设置f em> = 8 并返回第 2 步。以这种方式继续,直到 f = 13。

现在第 2 步的测试不满足,但第 3 步的余数为 0,所以 13 是 377 的因数(也是 2639 和 13195 的因数);输出13,设置n = 29,返回步骤2。这里满足步骤2中的测试,因为13 * 13 = 169大于29,所以29 是素数,输出它并停止。最终分解为 5 * 7 * 13 * 29 = 13195。

600851475143 的因式分解的工作方式完全相同,只是需要更长的时间。有更好的方法来分解整数。但是这个算法很简单,对于PE3来说已经足够了。

【讨论】:

    【解决方案3】:

    对于大量数据,这将运行得非常缓慢。考虑一下算法试图找到 num = 1000000 的质因数的情况。您的嵌套 FOR 循环将在考虑下一个数字之前生成 100 万次操作!

    考虑使用 Eratosthones 筛法将所有素数都设为某个整数。它不如某些其他 Sieves 高效,但易于实施。在实施之前花一些时间阅读筛子背后的理论——这将有助于您理解以后的问题。

    http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

    【讨论】:

    • 我同意 TheNuker 需要研究他们的算法,但这里的试验划分就足够了——他们真的不需要使用筛子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2014-10-09
    相关资源
    最近更新 更多