【发布时间】:2014-06-17 02:11:11
【问题描述】:
最初,代码输出组合而不替换。可以在Combination without replacement C++找到它,我添加了当集合完成时从集合中减去一个的部分。例如,如果输入集合 {0, 1, 2, 3, 4} 中的 4 个组合,则输出将如下所示:
comb(N=从中选择的项目,K=设置数量)
梳子(N=5, K=4) ~ 输出 ~
0,1,2,3
0,1,2,4
0,1,3,4
0,2,3,4
1,2,3,4
⇓ 梳(N=5, K=4-1) ~ 输出 ~
0,1,2
0,1,3
0,1,4
0,2,3
0,2,4
0,3,4
1,2,3
1,2,4
1,3,4
2,3,4
⇓ 梳(N=5,K=(4-2) 或 (3-1)) ~ 输出 ~
0,1
0,2
0,3
0,4
1,2
1,3
1,4
2,3
2,4
3,4
⇓ 梳(5,K=(4-3) 或 (2-1)) ~ 输出 ~ 结束
如果想将数字更改为具有相同顺序的数字的字母,如何使用模数来做到这一点?有关如何执行此操作的任何其他想法?
我的尝试如下。
#include <iostream>
#include <string>
using namespace std;
void comb(int N, int K)
{
std::string bitmask(K, 1);
bitmask.resize(N, 0);
do {
for (int i = 0; i < N; ++i)
{
if (bitmask[i])
std::cout << " " << i;
if (i == 0 || i%10 == 0)
std::cout << " " << "C" << endl;
else if (i == 1 || i%10 == 1)
std::cout << " " << "C#" << endl;
else if (i == 2 || i%10 ==1)
std::cout << " " << "D" << endl;
//the "else if" statements go up to i == 11 which is B//
}
} while (std::prev_permutation(bitmask.begin(), bitmask.end()));
}
int main()
{
for (int i = 6; i > 0; i--){
comb(6,i);
}
}
输出不太令人满意。
Sound
0C
1C#
2D
3D#
Sound
0C
1C#
2D
D#
0C
1C#
2D
D#
0C
...
【问题讨论】:
-
您能解释一下为什么需要使用模数吗?这是编程挑战吗?还是家庭作业?还是您只是觉得模数是一种方式?
-
这是一个个人项目,所以我不需要以任何特定方式做任何事情。我真的认为模数(模数?)是一种选择。当你想到更好的方法时,如果你想把豆子洒出来,那就去吧。
-
只是想指出,当 i=0 时 i%10=0,当 i=1 时 i%10=1。你不需要这样做:`(i==1)||(i%10==1)' 因为如果一个条件评估为真,另一个条件也必须评估为真(由于荒谬,真棒,疯狂等数学规则)。
标签: c++ algorithm combinations