从1-N中寻找子集

时间:2013-02-25 18:33:37

标签: c++ debugging

我编写了这个程序,用于从1-N中找到不同的可能子集。代码在N = 5时工作正常,但在此之后它会产生错误的输出。这是什么错误?

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int n, i,j ;
    cin>>n;
    int limit = 1<<n;
    int arr[limit];
    for( i=0; i<limit; i++)
        arr[i] = i+1;
    for( i=0; i<limit; i++){
        for( j=0; j<limit; j++){
            ( i & 1<<j)? printf("%d\t", arr[j]) : 0;
        }
        cout<<endl;
    }
    cout<<(1<<n)<<endl;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

int limit = 1<<n;

因此,如果n > 5,您有limit > 32

int arr[limit];

我假设您的实现具有VLA作为扩展,这不是符合标准的语言。

for( i=0; i<limit; i++)
    arr[i] = i+1;
for( i=0; i<limit; i++){
    for( j=0; j<limit; j++){
        ( i & 1<<j)

j >= 32时,你移动的距离比int的宽度更远(很可能,你的int是32位宽,观察到你的代码不适用于n > 5),这是未定义的行为,非常不太可能以产生正确输出的方式运行。

             ? printf("%d\t", arr[j]) : 0;
    }