您的位置:首页 > 其它

每日一小练——列出全部子集

2014-06-20 17:57 162 查看
上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练!

题目:列出全部子集

内容:写一个程序,列出{1,2,3,4,...,n}这个集合的全部子集,包含空集{ }。

解决问题的算法应该有非常多种,只是我发现了一种非常easy也非常好玩的方法,就是用二进制表示几何元素的方法

比方假设n是3,则子集有(不包含空集){1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}就是1*{0,1}and2*{0,1}and3{0,1}每一个组合出现一次,所以也能够看成是{0,0,1}{0,1,0}{0,1,1}{1,0,0}{1,0,1}{1,1,0}{1,1,1}所以就能够看成是二进制不断加一。

我的解法:上来没多想,打开vs2013就敲了起来,问题果然非常easy,分分钟就超神。。奥,不正确就攻克了!

#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
void showSubset(int n);
int n;
cout << "请输入一个n:";
cin >> n;
cout << endl;
cout << "求出子集的结果为:" << endl;
showSubset(n);
getchar();
getchar();
return 0;
}

void showSubset(int n)
{
//n += 1;
int Subset[1000] = { 0 };
int i, j;
cout << "{ }" << endl;
while (true)
{
for (i = 0; i < n && Subset[i] == 1; Subset[i] = 0, i++);
if (i == n)
break;
else
{
Subset[i] = 1;
}
cout << "{ ";
for (j = 0; j < n; j++)
{
if (Subset[j] == 1)
{
cout << j+1 << " ";
}
}
cout << "}";
cout << endl;
}

}


实验结果:



最后感谢 @daiweifeng 同学在 《高速Fibonacci数算法》中给我的提示。

欢迎大家增加每日一小练,嘿嘿!

每天练一练,日久见功夫,加油!

-End-

參考文献:《c语言名题精选百则》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: