为X位数生成0-9的所有唯一组合[重复]

Posted

技术标签:

【中文标题】为X位数生成0-9的所有唯一组合[重复]【英文标题】:Generate all unique combinations of 0-9 for X amount of digits [duplicate] 【发布时间】:2018-11-25 12:00:36 【问题描述】:

我无法想出逻辑来为 X 位数生成所有可能的 0-9 唯一组合。

例如,如果我想要总共 5 位数字的所有唯一组合,它将使用 0-9 生成它们。 (01234、01235等)

如果您对我的问题有任何简单而有创意的解决方案,我很想听听。我必须在 MASM 中实现它,但任何使用 C++ 的解决方案都应该不是问题。

【问题讨论】:

组合还是排列?也许您正在寻找std::next_permutation? @Sani:哦,等等,Generating permutations of a set (most efficiently) 是 permutations,这里的 OP 要求 combinations。所以不是完全相同的副本,但它确实具有可以在 asm 中实现的 next_permutation 的显式算法。我没有足够详细地研究这个问题,但 Jarod 的答案似乎是一种在给定排列算法的情况下获得组合的方法。 (IDK,如果我应该立即重新打开它,或者让它编辑到另一个 dup 目标中;对不起,我第一次应该更仔细地阅读。) @Richard:也找到了组合部分的副本。打印每个 sorted 排列就可以了,通过排列真/假值来完成。您可能希望使用字节数组而不是打包位图来实现它(如实际的vector<bool>)。然后,如果您想以有趣的方式进行操作,请将该位图与 SSSE3 pshufb 或 bmi2 pdep 一起使用以将整数左包。如果您有一台具有 BMI2 的机器,也许您可​​以将 AVX2 what is the most efficient way to pack left based on a mask? 用于字节而不是 32 位 int。否则使用标量循环! 【参考方案1】:

在 C++ 中,你可以使用类似的东西:

template <typename T>
void Combination(const std::vector<T>& v, std::size_t count)

    assert(count <= v.size());
    std::vector<bool> bitset(v.size() - count, 0);
    bitset.resize(v.size(), 1);

    do 
        for (std::size_t i = 0; i != v.size(); ++i) 
            if (bitset[i]) 
                std::cout << v[i] << " ";
            
        
        std::cout << std::endl;
     while (std::next_permutation(bitset.begin(), bitset.end()));

Demo

【讨论】:

以上是关于为X位数生成0-9的所有唯一组合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

0-9组成四位数的一共有多少组

JavaScript,从几个数组中获取所有唯一组合[重复]

递归求解:用0到9生成十位数的所有排列组合

递归求解:用0到9生成十位数的所有排列组合

查找并打印总和为 100 的每个唯一组合,并返回 1 到 100 之间数字的所有此类组合的计数 [重复]

如何从列表中创建唯一的非重复对组合