列出所有的子集
2016-03-03 00:00
316 查看
摘要: 算法
列出一个集合的所有子集有很多做法,题目中并没有要求依某个特定的次序来排列, 因此是不难做出来的。
因为集合中一共有n个元素,所以总共就会有2^n子集;例如{1,2,3}有如下子集:
{}
{1} {2} {3}
{1,2} {1,3} {2,3}
{1,2,3}
分析
看到2^n,就想起了二进制数,可以使用二进制的第 i 位表示是否包含集合的第 i 个元素,如数字6的二进制形式是110,表示取集合的第2,3两个元素组成的子集。这样0~2^n -1的数字就可以表示全部子集,每一个数字代表一个子集,实现应该不难。
算法要求
编写一个程序,列出{1,2,3,…,n}这个集合的所有子集,包括空集合。列出一个集合的所有子集有很多做法,题目中并没有要求依某个特定的次序来排列, 因此是不难做出来的。
因为集合中一共有n个元素,所以总共就会有2^n子集;例如{1,2,3}有如下子集:
{}
{1} {2} {3}
{1,2} {1,3} {2,3}
{1,2,3}
分析
看到2^n,就想起了二进制数,可以使用二进制的第 i 位表示是否包含集合的第 i 个元素,如数字6的二进制形式是110,表示取集合的第2,3两个元素组成的子集。这样0~2^n -1的数字就可以表示全部子集,每一个数字代表一个子集,实现应该不难。算法实现
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 20 #define LOOP 1 int main(void) { char digit[MAXSIZE]; int i, j; int n; char line[100]; printf("\nDirect Generation of All Subsets of a Set"); printf("\n========================================="); printf("\n\nNumber of Elements in the Given Set --> "); gets(line); n = atoi(line);/*把字符串转换成整型数据*/ /* ---You'd better check to see if n is too large--- */ for (i = 0; i < n; i++) /* clear all digits to 0,可以认为是初始化,注意digit是字符数组 */ digit[i] = '0'; printf("\n{}"); /* outpout empty set {} ,空集是所有集合的子集 */ while (LOOP) { for (i = 0; i < n && digit[i] == '1'; digit[i] = '0', i++) ; /* find first 0 position 找到第一次出现0的位置,或者设置它为0 */ if (i == n) /* if none, all pos. are 1 */ break; /* thus all elem. are in set,这是在遍历完所有的元素之后,结束循环*/ else digit[i] = '1';/* now add one to this pos,设置该位置的元素为1 */ for (i = 0; i < n && digit[i] == '0'; i++) ; /* find first 1 position 找到第一次出现1的位置 */ printf("\n{%d", i + 1); /* show its numner and */ for (j = i + 1; j < n; j++) /* others,遍历后面的元素,找到标记为1的位置,打印出来该位置对应的数*/ if (digit[j] == '1') printf(",%d", j + 1); printf("}"); } return 0; }
实验结果
当输入n=2的情况下,编译运行subset.c,实验结果如下:相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析