【发布时间】:2016-03-25 11:40:01
【问题描述】:
假设我想枚举所有 4 位模式,即来自 0 (0000) to 15 (1111)。一种方法是“真值表”方法:
0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, ... 1111
这种方法相当于从十进制数从 0 到 15。
另一种方法是使用格雷码,其中一次只翻转一个位:
0000, 0001, 0011, 0010, 0110, ... 1000
如何以最小化位总和的顺序系统地枚举所有数字?例如,类似于以下内容的内容:
0000, 0001, 0010, 0100, 1000, 0011, 0101, 1001, 0110, 1010, 1001, 0111, 1011, 1101, 1110, 1111
对于 4 位示例。
最终,将其扩展到任何基础都会很好,但二进制情况似乎最容易实现。
编辑:我可能应该明确表示该方法必须是生成的,即我不能计算所有可能的序列然后对它们进行排序;解决方案必须以与指定顺序相似的顺序迭代生成序列。
【问题讨论】:
-
这更像是一个组合问题而不是编程问题。
-
这看起来像是一个“组合”问题。例如,2位数字的集合(共4个)是从4中取2个的组合数。选中的项目为1,其他为0。所以只需从0迭代c到n,并枚举从 n 项中取出 c 项的方法。
-
您可以预先生成所选位数中可表示的所有数字,按位数排序,然后一一呈现。或者,您可以手动对用于生成 4 位变体的算法进行编码。你想要这个有什么特别的原因吗?
标签: c++ c binary sequence counting