【问题标题】:Finding numbers whose digits sum to a prime查找数字总和为素数的数字
【发布时间】:2012-03-27 12:41:08
【问题描述】:

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

提前谢谢...

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    这里有一些提示:

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

    希望这会有所帮助。

    【讨论】:

    • 范围是[1,72] [for 99999999]。除此之外 - 很好的解决方案。 +1
    • @amit 上限是 10^8 所以实际上范围是 [1,72],正如我在回答中所说的那样。我只是指出这小于 100,因此迭代该范围内的所有素数没有问题。
    • 我指的是你的答案的前一个版本,它表示18*9 < 200 数字,并想给出更严格的限制。
    • 你将如何实现f?如果要寻找一种不会遍历所有可能数字的解决方案,这似乎是这里最困难的部分。
    • 最简单的方法是进一步拆分问题 - 找到具有给定位数 d 的数字 x 的数量,并且这些数字的总和等于 sum。对于每一个这样的问题,我建议一种 dp 方法,其中 dp 是二维的 - 一个维度是剩下的总和,第二个是剩下的位数。所以现在你必须计算 g(d, sum, a)。我可以提供解决问题的代码,但 SPOJ 的想法是让用户自己想出解决方案。
    【解决方案2】:

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

    1) 获取 2..71 范围内的素数列表(任何考虑都可以忽略 1 和 72,因为两者都不是素数)。

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

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

    现在你有了你需要的数字列表。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我怀疑它会产生很大的影响,因为所需的素数范围是[1,72]
      • @amit 10^7 花了 17 秒,所以我猜 10^8 将花费 10 倍。这显然不是最好的方法。但如果要求不低于 1 分钟,则代码行数很少,易于理解。
      • 我在 10^8 上运行它,用时 3:11。
      • @YuriyFaktorovich 在计算机编程比赛中通常的时间限制是 1 秒,但对于这个问题,它可能会更加严格。对于最大测试用例,我相信最好的解决方案将在不到 0.1 秒的时间内完成。
      • @izomorphius 如果是,那我就更正了。但他没有在问题中具体说明。
      猜你喜欢
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多