【m元素集合的n个元素子集】
2018-06-18 04:09:14来源:未知 阅读 ()
/* m元素集合的n个元素子集 说明: 假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些? 解法: 假设有5个元素的集点,取出3个元素的可能子集如下: {1 2 3} 、{1 2 4 } 、{1 2 5} 、{1 3 4} 、{1 3 5} 、{1 4 5} 、{2 3 4} 、{2 3 5} 、{2 4 5} 、{3 4 5}这些子集已经使用字 典顺序排列,如此才可以观察出一些规则: 如果最右一个元素小于m,则如同码表一样的不断加 1 如果右边一位已至最大值,则加1的位置往左移 每次加1的位置往左移后,必须重新调整右边的元素为递减顺序 所以关键点就在于哪一个位置必须进行加1的动作,到底是最右一个位置要加1? 还是其它的位置?在实际撰写程式时,可以使用一个变数positon来记录加1的位置,position的初值设定为n-1 ,因为我们要使用阵 列,而最右边的索引值为最大 的n-1,在position位置的值若小于m就不断加1,如果大于m 了, position就减1,也就是往左移一个 位置;由于位置左移后,右边的元素会 经过调整,所以我们必须检查最右边的元素是否小于m,如果是,则position调整回n-1,如 果不是,则positon维持不变。 */ #include<stdio.h> #include<stdlib.h> #define MAX 20 int main(void) { int set[MAX]; int m, n, position; int i; printf("输入集合数: "); scanf("%d", &m); printf("输入取出元素 n:"); scanf("%d", &n); for(i = 0; i < n; i++) { set[i] = i + 1; } for(i = 0; i < n; i++) { printf("%d", set[i]); } putchar('\n'); position = n - 1; while(1) { if(set[n - 1] == m) { position--; } else { position = n - 1; } set[position]++; for(i = position + 1; i < n; i++) { set[i] = set[i - 1] + 1; } for(i = 0; i < n; i++) { printf("%d", set[i]); } putchar('\n'); if(set[0] >= m - n + 1) { break; } } return 0; }
运行结果:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- STL之set 2020-04-28
- 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的 2020-04-15
- C++中set的使用 2019-12-23
- C++ map insert 另一个map的子集 2019-10-16
- 插入排序 2019-10-08
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash