递归实现指数型枚举:
从 1∼n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。
输入格式: 输入一个整数 n。
输出格式: 每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好 1 个空格隔开。
对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15
输入样例:
3
输出样例:
3
2
2 3
1
1 3
1 2
1 2 3
代码展示:
#include <iostream>
using namespace std;
int n;
int main(){
cin >> n; //输入n
for (int i=0;i<(1<<n);i++){ // 我的测试值是4,所以1<<n的值是16;
for (int j=0;j<=n;j++){ // j的存在是为了下面的一步,j只有1,2,3,4四个值;
if (i>>j&1){ // i=1,j=0,那么就会有以下结果:1>>0= 0000 0001;
cout<<j+1<<" "; // 继续计算 0000 0001 & 0000 0001 = 0000 0001;
// 好,输出1
} // i=1 , j=1 ;0000 0001右移一位就是0了,j再大也没有意义了。
} // i=2,j=0; 0000 0010->0000 0010; 0000 0010 & 0000 0001-> 0
cout<<endl; // i=2,j=1; 0000 0010->0000 0001; 0000 0001 & 0000 0001-> 1
//输出2
}
return 0;
}
小结:
>>和<<的一般带来的作用到底是啥?他们一般怎么用?还有就是最后的那一步& 1很巧妙,这一步一般怎么用的呢?这些疑问只能等我弄懂之后再来了害,悔恨学C++太晚了。。。