【问题标题】:Algorithm to find if a number is sum of multiples of other numbers找出一个数字是否是其他数字的倍数之和的算法
【发布时间】:2013-06-10 11:35:26
【问题描述】:

我有三个数字 6,9,20。对于给定的数字,我需要检查它是否可以等于这三个数字的倍数之和。 例如: n = 47 则可以确定 47 = 9*3 + 20

n=23 那么不可能没有组合。

可以在o(n^3)中确定。但是有没有更好的方法呢?

【问题讨论】:

  • 系数可以为负吗?
  • 你需要看看群论和生成器。数学家已经解决了这个问题,以确定例如覆盖整个货币价值集所需的最小硬币集(便士、美元)。
  • @KarolyHorvath:n=41 可以用负系数解决,所以我猜不是。
  • 你是对的,gcd 是 1,所以每个数字都有一个解。
  • 我想我理解错了,但是 41= 2*6 + 1*9 + 1*20

标签: algorithm numbers


【解决方案1】:

这是一个线性丢番图方程。

如果系数可以为负,则检查Bézout's identity

如果总和是数字的 gcd 的倍数,则有一个解决方案。

在您的示例中 gcd=1,因此对于任何总和都有解决方案。所以我猜你正在寻找非负系数.. :(

【讨论】:

  • Károly,作为一名算法专家,你能看看我的解决方案吗?
【解决方案2】:

我想我有一个适合你的解决方案(仅当系数可以为 0 时)。

6 和 9 的倍数之和都是 3 的倍数(除了 3 本身)。所以我们可以说,我们需要检查一个数字是否等于3*k + 20*l

所以,如果你有一个号码n

  • 如果n是3的倍数,有一个分解,我们可以发现它很简单(如果n是偶数,它是x*6,如果它是奇数,它是9+x*6
  • 如果n 不是 3 的倍数,则减少 20 直到达到,然后转到第一步。 如果你低于 0,但仍未找到 3 的倍数,则无解。
  • 每个n > 60 至少有一个解决方案

小心 23 和 43,因为 3 不能这样写,所以 23 和 43 也不能。

为什么要这样做?因为20 mod 3 = 240 mod 3 = 160 mod 3 =0。所以最多减 20 2 次后,你会发现一个 3 的倍数很容易解。

【讨论】:

    猜你喜欢
    • 2013-11-24
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多