【问题标题】:For a given number N i have to find all the prime numbers it's consisting of对于给定的数字 N,我必须找到它包含的所有素数
【发布时间】:2010-02-19 20:51:47
【问题描述】:

需要关于算法的建议。

对于给定的数字 N,我必须找到它所包含的所有素数,如下所示:

N = 49
49 = 7 ^ 2
N = 168
168 = (2 ^ 3) * (3 ^ 1) * (7 ^ 1)

如果你想帮助我更多,你可以用 C++ 编写算法。

谢谢。

【问题讨论】:

  • "如果你想帮助我更多,你可以用 C++ 编写算法。"如果您实际上不必尝试或学习任何东西,那么没有人会真正帮助您。我希望编程如此简单:“为我做这个……完成!”
  • 无论如何,您要查找的内容称为素数分解。存在许多算法,它是数论和安全性中非常重要的课题。一个简单的算法是除法:en.wikipedia.org/wiki/Trial_division

标签: c++ algorithm primes


【解决方案1】:

最直接的方法是试除法。基本上只需尝试将 n 除以每个素数,直到 sqrt(n)。对于大数,这是一个非常慢的算法。

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

如需更复杂的算法,请尝试http://en.wikipedia.org/wiki/Integer_factorization

【讨论】:

  • “对于大数字,这是一个非常慢的算法”。从技术上讲,对于具有大素因数的数字,这是一个非常慢的算法。由于他想要完全分解,自然的事情是在你找到它时除以每个因子,这样你只有在 n 是素数时才能一直到达 sqrt(n)。通过这种方式,您可以将 2^31 分解为 31 个试除法,而 2^31-1 需要大约 2^16 个试除法(或者在 2 之后开始跳过偶数等时更少)。
  • @Steve:实际上,建议的算法只尝试素数,所以你要测试几千个,而不是几万个候选者。但如前所述,它是错误的:它确实发现 7 除以 49,但不是频率。这两个建议结合起来确实有效,例如147 => 2^0 * 147 => 2^0 * 3^1 * 49 = 2^0 * 3^1 * 5^0 * 49 = 2^0 * 3^1 * 5^0 * 7^1 * 7 = 2^0 * 3^1 * 5^0 * 7^2(4 和 6 被跳过,因为它们不是素数)
  • @MSalters:公平点,我错过了。为任意 n 计算直到 sqrt(n) 的所有素数留给读者作为练习,但这就是固定大小类型派上用场的地方。
猜你喜欢
  • 2020-10-03
  • 2020-01-01
  • 1970-01-01
  • 2019-08-23
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多