当不同可能性的数量很小时,可以使用查找表。
首先,号码的三位数字的所有可能的组合,例如:
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
,3
和9
中找到组合号1
;组合2
在索引2
,6
和18
等等。
为了获得组合的号码,只需检查
int combNumber = lookup[9*a + 3*b + c];
只是为了澄清,你有三个变量要存储0,1或2吗?用户可以输入001/010/100为1,可以输入002/020/200为2? – Steven
我会在正文中予以澄清。 – pfnuesel
'001'和'110'是否一样? – dasblinkenlight