【发布时间】:2012-03-27 12:41:08
【问题描述】:
我试图在 SPOJ 上解决这个问题,我必须找出一个范围内有多少个数字总和为素数。这个范围可以很大,(给出 10^8 的上限)。天真的解决方案超时了,我只是循环了整个范围并检查了所需的条件。我似乎也找不到模式或公式。有人可以指导一下吗?
提前谢谢...
【问题讨论】:
标签: algorithm
我试图在 SPOJ 上解决这个问题,我必须找出一个范围内有多少个数字总和为素数。这个范围可以很大,(给出 10^8 的上限)。天真的解决方案超时了,我只是循环了整个范围并检查了所需的条件。我似乎也找不到模式或公式。有人可以指导一下吗?
提前谢谢...
【问题讨论】:
标签: algorithm
这里有一些提示:
希望这会有所帮助。
【讨论】:
[1,72] [for 99999999]。除此之外 - 很好的解决方案。 +1
18*9 < 200 数字,并想给出更严格的限制。
f?如果要寻找一种不会遍历所有可能数字的解决方案,这似乎是这里最困难的部分。
我(严重)怀疑这种“相反”的方法是否会比@izomorphius 的建议更快,但它可能会引发一些关于提高程序性能的想法:
1) 获取 2..71 范围内的素数列表(任何考虑都可以忽略 1 和 72,因为两者都不是素数)。
2) 枚举列表中每个素数的整数分区。这是一些Python code。您需要对其进行修改,以免生成无效的分区,例如包含大于 9 的数字的分区。
3) 对于每个分区,用 0 填充以形成一组 8 位数字,然后枚举填充集的所有排列。
现在你有了你需要的数字列表。
【讨论】:
使用 Eratosthenes 的筛子生成最大和 (9 + 9...) 的素数。将它们放在哈希表中。然后你可能会快速循环遍历 10^8 个数字并将它们的总和相加。可能有更有效的方法,但这应该足够快。
【讨论】:
[1,72]