查找子集c

时间:2017-10-18 17:08:09

标签: c discrete-mathematics

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,我打印原始set的相应元素。但是在创建矩阵时,它会将相同的二进制值分配给两个连续的行到最后我甚至无法获得一半的子集。您认为代码有什么问题?

2 个答案:

答案 0 :(得分:0)

啊,因为你没有覆盖LSB或第0个元素。 for (j = (n-1); j >= 0; j--)您错过了=

此外,你必须知道j是否设置了i

而不是pow,你可以简单地使用(1<<n)[相当于2^n]

您的代码无法读取。我将发布伪代码。

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函数由算法实现,并使用浮点函数和值来计算功率值。

因此浮点指向幂n的功率不一定是重复乘以n次。因此,您最终会遇到一些错误,执行速度也会慢一些。

按位更快?

是的。即使现代实现正在对整个架构进行更改,但仍然不会因为使用按位而失去性能。如果不相同,它们中的大多数将具有比添加操作更好的性能。

答案 1 :(得分:0)

你的程序最复杂。对于这个问题有更好的解决方案,复杂性最小。无论如何,你的代码问题都是'&lt; ='

i <= pow(2,n)-1

此外,您可以使用i < 1<<n两者都相同,但第二个更好,更快。同样的问题发生在内部循环中,你没有放置'='符号。即,j>=0。此外,该计划还不错。

您问题的更好解决方案可能如下所示。

void subsets(char A[], int N)
{
    int i,j;
    for( i = 0;i < (1 << N); ++i)
    {
        for( j = 0;j < N;++j)
            if(i & (1 << j))
                printf("%c  ",  A[j] );
        printf("\n");
    }
}

在此不需要外部二进制转换或矩阵。