0

我编写了这个程序来从 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;
}
4

1 回答 1

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的 s 是 32 位宽,由您的代码不适用于的观察结果支持n > 5),所以这是未定义的行为,并且不太可能以生成的方式表现正确的输出。

             ? printf("%d\t", arr[j]) : 0;
    }
于 2013-02-25T18:38:44.100 回答