每日一算法:m元素中取n个元素(高效算法)

举报
悦来客栈的老板 发表于 2020/12/30 01:29:30 2020/12/30
【摘要】 五个数种取三个 1 1 1 0 0   1 2 3 1 1 0 1 0   1 2 4 1 0 1 1 0   1 3 4 0 1 1 1 0   2 3 4 1 1 0 0 1   1 2 5 1 0 1 0 1   1 3 5 0 1 1 0 1&n...

五个数种取三个
1 1 1 0 0   1 2 3
1 1 0 1 0   1 2 4
1 0 1 1 0   1 3 4
0 1 1 1 0   2 3 4
1 1 0 0 1   1 2 5
1 0 1 0 1   1 3 5
0 1 1 0 1   2 3 5
1 0 0 1 1   1 4 5
0 1 0 1 1   2 4 5
0 0 1 1 1   3 4 5
思路,如上所示,找到第一个 1 0 分界点。将分界点前面的1的个数从第一个位置开始往后排
排完后再将所排位置与分界点的位置之间排0。如此循环即可。


  
  1. #include <stdio.h>
  2. void fulledition (int m,int n)
  3. {//m个数中取n个
  4. int t[1000];
  5. int i,a,sum,b;
  6. for (i=1;i<=n;i++)
  7. {//1...n全部初始化为1
  8. t[i]=1;
  9. }
  10. for (i=n+1;i<=m;i++)
  11. {//n+1...m全部初始化为0
  12. t[i]=0;
  13. } //初始化t[i]的值
  14. for(i=1;i<=m;i++)
  15. {//先打印1...n
  16. if (t[i]==1)
  17. printf("%d ",i);
  18. }
  19. printf("\n");
  20. for(i=1;i<=m;i++)
  21. {
  22. if(t[i]==1&&t[i+1]==0)
  23. {//查找第一个分界点,将这个分界点0变为1,1变为0
  24. sum=0;
  25. for(a=1;a<i;a++)
  26. {//计算分界点前面1的个数,然后从前往后置1
  27. sum=sum+t[a];
  28. }
  29. t[i+1]=1;
  30. t[i]=0;
  31. for(b=1;b<=sum;b++)
  32. {//从1开始置1
  33. t[b]=1;
  34. }
  35. for(b=sum+1;b<i;b++)
  36. {//从sum+1开始置0
  37. t[b]=0;
  38. }
  39. for(i=1;i<=m;i++)
  40. {//打印t[i]设置为1的i值
  41. if (t[i]==1)
  42. {
  43. printf("%d ",i);
  44. }
  45. }
  46. printf("\n");
  47. i=0;//不断的从第一个开始寻找
  48. }
  49. }
  50. }
  51. int main ()
  52. {
  53. int n,m;
  54. printf("输入M:");
  55. scanf("%d",&m);
  56. printf("输入N:");
  57. scanf("%d",&n);
  58. fulledition(m,n);
  59. return 0;
  60. }


 

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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