我有三个数字6,9,20。对于给定的数字,我需要检查它是否可以等于这三个数的倍数之和。 对于Ex: n = 47然后可以确定47 = 9 * 3 + 20
n = 23然后就不会有任何组合。
可以用o(n ^ 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 > 60
,20 mod 3 = 2
,40 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