查找数字是否是其他数字的倍数的算法

时间:2013-06-10 11:35:27

标签: algorithm numbers

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

n = 23然后就不会有任何组合。

可以用o(n ^ 3)确定。但是有更好的方法吗?

3 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:1)

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

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

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

  • 如果n是3的倍数,则会有分解,我们可以发现它很简单(如果n是偶数,则为x*6,如果是奇数,则为{ {1}}
  • 如果9+x*6不是3的倍数,则减去20,直到第一步。 如果你低于0但仍然没有找到3的倍数,则没有解决方案。
  • n
  • 至少有一个解决方案

小心23和43,因为3不能这样写,23和43都不能。

为什么要这样做?因为n > 6020 mod 3 = 240 mod 3 = 1。因此,在最多减少20次后,你会发现3的倍数可以很容易地解决。

答案 2 :(得分:0)

gkovacs90,您的算法非常有趣。但是,看来 n> 43 中至少有一种解决方案。

20 + 6 + 6 + 6 + 6 = 44
9 + 6 + 6 + 6 + 6 + 6 + 6 = 45
20 + 20 + 6 = 46
20 + 9 + 6 + 6 + 6 = 47
6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 48
20 + 20 + 9 = 49
20 + 6 + 6 + 6 + 6 + 6 = 50
9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 51
20 + 20 + 6 + 6 = 52
20 + 9 + 6 + 6 + 6 + 6 = 53
6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 54
20 + 20 + 9 + 6 = 55
20 + 6 + 6 + 6 + 6 + 6 + 6 = 56
9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 57
20 + 20 + 6 + 6 + 6 = 58
20 + 9 + 6 + 6 + 6 + 6 + 6 = 59
6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 60
20 + 20 + 9 + 6 + 6 = 61
20 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 62
9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 63
20 + 20 + 6 + 6 + 6 + 6 = 64
20 + 9 + 6 + 6 + 6 + 6 + 6 + 6 = 65
6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 66
20 + 20 + 9 + 6 + 6 + 6 = 67
20 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 68
9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 69
20 + 20 + 6 + 6 + 6 + 6 + 6 = 70
20 + 9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 71
6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 72
20 + 20 + 9 + 6 + 6 + 6 + 6 = 73
20 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 74
9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 75
20 + 20 + 6 + 6 + 6 + 6 + 6 + 6 = 76
20 + 9 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 77
6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 + 6 = 78
20 + 20 + 9 + 6 + 6 + 6 + 6 + 6 = 79