for (i = 0; i < (pow(2,n)-1); i++) {
x = binary_conversion(i);
for (j = (n-1); j > 0; j--) {
if (x == 0) {
M[i][j] = 0;
}
else {
M[i][j] = x % 10;
x = x / 10;
}
}
}
我想打印一个集合的子集,因此对于包含 n 个元素的集合,我得到 2^n 的值。从 0 到 2^n,我将这些值转换为二进制。我将二进制值保存在矩阵中,当我遍历矩阵时,如果值为 1,我将打印原始集合的相应元素。但是在创建矩阵时,它将相同的二进制值分配给两个连续的行所以最后我什至无法获得一半的子集。您认为这段代码有什么问题?
最佳答案
啊,因为你没有覆盖 LSB 或第 0 个元素。 for (j = (n-1); j >= 0; j--)
您错过了=
.
您还必须知道是否 j
-th 位设置在 i
中或不。
您可以简单地使用 ( 1<<n
)[相当于 2^n
而不是 pow ]
您的代码不可读。我将发布伪代码。
for ( int i = 0; i<= (1<<numOfSetElmts)-1; i++)
{
//print Subset-i
for(int pos = 0; pos<=n-1;pos++)
if( i&(1<<pos) )
print Set[pos]
}
为什么我不使用pow
?
pow函数是通过算法实现的,使用浮点函数和值来计算幂值。
float 的幂次方n
不一定要重复乘以n次。结果,你最终会遇到一些错误,并且执行速度也会慢一些。
按位更快?
是的。即使现代实现对整个体系结构进行了更改,但使用按位仍然不会损失性能。大多数情况下,即使不相等,它也会比加法运算有更好的性能。
关于c - 直接查找子集 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46815618/