当不同可能性的数量很少时,可以使用查找表。
首先,对所有可能的三位数组合进行编号,如下所示:
Combinations N Indexes
------------- - ------
000 0 0
001, 010, 100 1 1, 3, 9
002, 020, 200 2 2, 6, 18
011, 101, 110 3 4, 10, 12
012, 021, 102, 120, 201, 210 4 5, 7, 11, 15, 19, 21
022, 202, 220 5 8, 20, 24
111 6 13
112, 121, 211 7 14, 16, 22
122, 212, 221 8 17, 23, 25
222 9 26
第一列显示相同的组合;第二列显示组合的编号(我任意分配它们);第三列显示每个组合的索引,计算为9*<first digit> + 3*<second digit> + <third digit>
。
接下来,为这十个组合中的每一个构建一个查找表,使用这个表达式作为索引:
9*a + 3*b + c
其中a
、b
和c
是您拥有的三个数字。该表如下所示:
int lookup[] = {
0, 1, 2, 1, 3, 4, 2, 4, 5, 1
, 3, 4, 3, 6, 7, 4, 7, 8, 2, 4
, 5, 4, 7, 8, 5, 8, 9
};
这是对第一个表的重写,索引处的值对应于列中的值N
。例如,1
在索引1
、3
和处找到组合数9
;组合2
位于索引2
、6
和18
,依此类推。
要获得组合的数量,只需检查
int combNumber = lookup[9*a + 3*b + c];