掷硬币的组合

时间:2019-05-10 22:13:45

标签: c++ recursion combinations

我正在尝试编写一个小程序来计算硬币翻转中的组合:

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 次抛硬币。

也许我需要改变解决问题的方法并应用递归,但是我不知道怎么做。

您有什么建议吗?

谢谢。

1 个答案:

答案 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_stringstd::bitset的大小在编译时是固定的,因此我使用了32位宽的bitset,然后构造了一个子字符串以仅选择低位,以便您可以在运行时选择n

std::bitset