列出所有子集-----字典顺序 2013年1月14日
来源:互联网 发布:怎么用网络呼叫电话 编辑:程序博客网 时间:2024/06/05 15:22
问题描述:写一个程序,用字典顺序把一个集合的所有子集找出来。
此题的思路来自《C语言名题精选百则技巧篇》:字典顺序,也就是字符串比较时的顺序规则。可以采取这样的思路(以下是我根据书上的思路进行归纳再加上我自己的理解得来的步骤):
先定义n是集合的个数并且集合是已经从小到大排好顺序的{1,2,3....n}的集合。集合从{1}开始(此时下标index=0),
1.当state[i]<n时,就向右进行扩展,将state[2]=2;接着将state[3]=3;
2.当state[index]==n时,就不能向右边进行扩展了,此时就需要向左边处理了。此时的集合是{1,2,3,....,n-2,n-1,n},那么,要找比这个集合刚好大一点的,就是{1,2,3,....n-2,n},所以就可以归纳出规则为:将index减1并且将state[index]加1。
3.如果state[0]==n,那么循环就结束,反之则重复第1,2步,直到state[0]==n。
代码如下:
1 #include <stdio.h> 2 #define MAX 1000 3 4 int main() 5 { 6 int n=3; 7 int set[MAX]={1}; 8 int index=0; 9 int count=2;10 printf("1:{}\n2:{1}\n");11 while(set[0]!=n)12 {13 if(set[index]<n) 14 { 15 set[index+1]=set[index]+1;16 index++;17 }18 else19 {20 index--; 21 set[index]++;22 }23 int a_index;24 count++;25 printf("%d:{",count);26 for(a_index=0;a_index<=index;a_index++)27 printf("%d ",set[a_index]);28 printf("}\n");29 }30 return 0;31 }
参考资料:《C语言名题精选百则技巧篇》
- 列出所有子集-----字典顺序 2013年1月14日
- 列出所有子集----------2013年1月3日
- 列出所有子集(采用列出2进制数的方法)-------------2013年1月4日
- 列出所有K个元素的子集-----2013年1月26日
- 列出所有子集(字典顺序)
- 每日一小练——按字典顺序列出所有子集
- 产生所有排列---字典顺序-----2013年1月23日
- 列出所有子集(格雷码顺序)
- 列出所有排列(字典顺序)
- 列出{1,2,,,,n}的所有子集
- 列出所有子集
- oracle 列出时间范围内所有日和所有月
- 每日一小练——按字典顺序列出所有排列
- 列出所有子集(二进制递增方式)
- 列出所有K个元素的子集
- 每日一小练——列出所有子集
- 集合所有子集,无字典顺序与有字典顺序的两种解法(C/OC)
- [3月22日的脚本] 列出所有的群集服务器 (PowerShell)
- fedora9.0 NFS挂载文件系统到6410上
- Eclipse安装插件支持jQuery智能提示
- RMAN blockrecover命令恢复数据块
- 求1+2+…+n
- CentOS 6.3 安装MongoDB
- 列出所有子集-----字典顺序 2013年1月14日
- 让你的vim新建源文件的时候智能添加注释和代码
- gnuplot 入门教程 1
- VIM 查找与替换
- Bloom Filter概念和原理
- Android开发中audio focus的处理
- 开始OPENGL了.
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
- EXTJS4.x之ToolBar的使用