假设我有2个符号由A和B组成。我想打印A和B的所有组合,最大长度为n。 n可以是3,4或5。
例如当n = 3时,总共有8种可能性:
AAA
AAB
ABB
BBB
BBA
BAA
BAB
ABA
最简单有效的方法是什么? 感谢
答案 0 :(得分:2)
可能性对应于您可以用n位表示的所有可能数字的位模式:
0 = 000 -> AAA
1 = 001 -> AAB
2 = 010 -> ABA
3 = 011 -> ABB
4 = 100 -> BAA
5 = 101 -> BAB
6 = 110 -> BBA
7 = 111 -> BBB
您可以简单地循环数字,并使用字符而不是二进制数字来获取二进制表示。
示例:
var n = 3;
var chars = [ 'A', 'B' ];
var max = Math.pow(2, n);
for (var i = 0; i < max; i++) {
var s = '', x = i;
while (s.length < n) {
s = chars[x & 1] + s;
x >>= 1;
}
document.write(s + '<br>');
}
答案 1 :(得分:0)
对于给定的 n ,总有 2 ^ n 方式,对于每个位置,我们可以选择2个不同的符号。对于一般数量的符号,通常的方法是回溯,但由于您只有两个符号,使用位掩码的更简单方法有效。
请注意,以二进制编写的 0 和 2 ^ n - 1 之间的数字包含所有可能的长度为 n 的位掩码,因此您可以只需&#34;以二进制形式打印数字,写入A或B,具体取决于该位是0还是1。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i < (1 << n); ++i) {
for (int j = 0; j < n; ++j) {
cout << (((i >> j) & 1) ? "B" : "A");
}
cout << endl;
}
}
答案 2 :(得分:0)
将int转换为bit-bool数组,然后循环该数组。只要你知道它只有2个字符(A
和B
),那么二进制应该可以工作。
permutations(int n):
for(int i = 0; i < 2^n; i++)
print convert(toBitArray(int));
string convert(bool[] bits)
string retStr = "":
for(int b = 0; b < bits.size; b++)
if(bits[b])
retStr += "A";
else
retStr += "B";
bool[] toBitArray(int i):
//converts int to a a bit-bool array
答案 3 :(得分:0)
由于你只有两个符号,你可以使用多个N位的二进制表示,用A替换零,用B替换1。这是一些伪代码,因为没有语言是指定的
for k in range 0 to 2^N-1
printString(k, N)
end for
printString(k,N)
for N times
if LSB(k)==0 //(or mod 2 is 0)
print A
else
print B
shift k right one bit //(or divide by 2)
print newline