每日一算法:产生可能的集合(一)

举报
悦来客栈的老板 发表于 2020/12/29 00:47:36 2020/12/29
【摘要】 问题描述:产生可能的集合 说明 给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3, 则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。 解法 如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法, 并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字...





















例如:000 => 100 => 010 => 110 => 001 => 101 => 011 => 111



  
  1. #include <stdio.h>
  2. #define MAXSIZE 20
  3. int main()
  4. {
  5. int i,j,n;
  6. char digit[MAXSIZE];
  7. printf("输入集合个数:");
  8. scanf("%d",&n);
  9. for (i=0; i<n; i++)
  10. {
  11. digit[i] = '0';
  12. }
  13. printf("{}");//输出空集
  14. while (1)
  15. {
  16. for (i=0; i<n && digit[i] == '1'; digit[i] = '0', i++);//找到第一个0,并将前面的1置为0
  17. if (i == n)
  18. {//如果全部为1,则查找结束,退出循环
  19. break;
  20. }
  21. else
  22. {//将找到的第一个0置为1
  23. digit[i] = '1';
  24. }
  25. for (i=0; i<n && digit[i] == '0'; i++);//这一句貌似没用吧,i的值已经到了第一个1的位置啊???
  26. printf("\n{%d",i+1);//打印
  27. for (j=i+1; j<n; j++)
  28. {//如果后面也有值为‘1’的位置,也打印
  29. if (digit[j] == '1')
  30. {
  31. printf(",%d",j+1);
  32. }
  33. }
  34. printf("}");
  35. }
  36. printf("\n");
  37. return 0;
  38. }



文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/14088257

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。