给定一组整数,找出它们是否可以加到一个数字上



我们的数字是这些整数的和:[1,2,4]

例如,列表中的3(2+1(、6(4+2(、5(1+4(、7(1+2+4(数字只能使用一次。它们不能重复。

现在我需要找到所有这样构造的数字,其中包括它们的和中的2。

这就是我要为这个短列表写的内容:

SELECT * FROM [TABLE] WHERE number = 2
OR number - 2 + 1 = 0  
OR number - 2 + 1 + 4 = 0
OR number - 2 + 4 = 0

但假设我们在一个列表中有7个数字[1,2,4,8,16,72128]

所以这样写显然太长了,而且我没能想出一些算法:(

我希望问题是明确的

会只是这样吗?

SELECT * from [Table] WHERE number & 2 = 2

它使用逐位AND来查找具有2位集合的数字。

EDIT
我假设用于创建总和(1,2,4,..(的数字列表都是2的幂。您可以使用这些数字将任何(正数(相加(前提是列表足够长(,每个数字使用0或1次。

您可以使用递归CTE:

with n as (
select v.n
from (values (1), (2), (4)) v(n)
),
cte as (
select n as num, n as max_n, convert(varchar(max), n) as calculation
from n
union all
select num + n.n, n.n as max_n, concat(calculation, ' + ', n.n)
from cte join
n
on n.n > cte.max_n
)
select distinct num, calculation
from cte;

这是一个数据库<>不停摆弄

此版本还包括计算。如果有多种表示数字的方法,则数字可以多次出现。

以上生成所有组合。在生成所有"2"之后,您可以向下筛选到它们。或者,您可以单独处理"2"——只需生成不包含"2"的所有组合,然后将"2"添加到最终结果中。

相关内容

最新更新