我正在尝试编写一个小程序来计算硬币翻转中的组合:
1)用户输入他想执行多少次抛硬币。
2)程序必须根据用户输入返回所有可能的组合。
示例:
掷一枚硬币->结果:高温
抛硬币2次->结果:HH HT TH TT
掷3枚硬币->结果:HHH HHT HTH HTT THH THT TTH TTT
ecc ...
我已经在C ++中尝试过这种方法:
#include <iostream>
#include <string>
using namespace std;
// function that returns the coin face using the indexes used in for loops below
string getCoinFace(int index) {
if(index == 0)
return "H";
return "T";
}
int main() {
string result = "";
// 3 nested loops because I toss the coin 3 times
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 2; j++) {
for(int k = 0; k < 2; k++) {
result += getCoinFace(i) + getCoinFace(j) + getCoinFace(k) + '\n';
}
}
}
cout << result;
/* --OUTPUT--
HHH
HHT
HTH
HTT
THH
THT
TTH
TTT
*/
return 0;
}
这仅在执行3次抛硬币后才有效,但我需要处理 N 次抛硬币。
也许我需要改变解决问题的方法并应用递归,但是我不知道怎么做。
您有什么建议吗?
谢谢。
答案 0 :(得分:1)
JLS简直微不足道:
#include <iostream>
#include <bitset>
int main() {
const unsigned max_n = 32;
unsigned n = 3;
unsigned combos = 1 << n;
for (unsigned i=0;i<combos;++i)
std::cout << std::bitset<max_n>(i).to_string('H','T').substr(max_n-n,n) << "\n";
}
简而言之,std::bitset
将传递给构造函数的无符号转换为二进制表示形式。您可以将其转换为由std::string
传递给char
的{{1}}组成的to_string
。 std::bitset
的大小在编译时是固定的,因此我使用了32位宽的bitset
,然后构造了一个子字符串以仅选择低位,以便您可以在运行时选择n
。>