我编写了这个程序,用于从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;
}
答案 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;
}