查找数字总和为素数的数字

时间:2012-03-27 12:41:09

标签: algorithm

我试图在SPOJ上解决这个问题,我必须找到数字总和为素数的范围内有多少个数字。该范围可以非常大,(给出10 ^ 8的上限)。天真的解决方案超时,我只是在整个范围内循环并检查所需的条件。我似乎也找不到模式或公式。有人可以指示继续进行吗?

提前致谢...

3 个答案:

答案 0 :(得分:5)

以下是一些提示:

  • 尝试编写一个函数,该函数可以查找给定范围内有多少数字具有给定的数字总和。实现这一点的最简单方法是编写一个函数,该函数返回给定数字总和的数字数量,直到给定值a(调用此f(sum,a)),然后在a到a的范围内返回这些数字的数量b将是f(sum,b)-f(sum,a-1)
  • 注意数字本身的总和不会太高 - 高达8 * 9< 100所以要检查的总金额很少

希望这有帮助。

答案 1 :(得分:1)

我(严重)怀疑这种“相反”的方法是否比@ izomorphius的建议更快,但它可能会提示一些改善程序性能的想法:

1)获取2..71范围内的素数列表(你可以从任何考虑中省略1和72,因为它们都不是素数)。

2)枚举列表中每个素数的整数分区。这是一些Python code。您需要对其进行修改,以免生成无效的分区,例如包含大于9的数字的分区。

3)对于每个分区,使用0填充以生成一组8位数,然后枚举填充集的所有排列。

现在您有所需的数字列表。

答案 2 :(得分:0)

使用Eratosthenes筛子生成质数,最大总和(9 + 9 ...)。将它们放在哈希表中。然后你可以快速循环通过10 ^ 8个数字并加总它们的总和。可能有更有效的方法,但这应该足够快。