每日一算法:m元素中取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&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。如此循环即可。
-
#include <stdio.h>
-
-
void fulledition (int m,int n)
-
{//m个数中取n个
-
int t[1000];
-
int i,a,sum,b;
-
for (i=1;i<=n;i++)
-
{//1...n全部初始化为1
-
t[i]=1;
-
}
-
for (i=n+1;i<=m;i++)
-
{//n+1...m全部初始化为0
-
t[i]=0;
-
} //初始化t[i]的值
-
for(i=1;i<=m;i++)
-
{//先打印1...n
-
if (t[i]==1)
-
-
printf("%d ",i);
-
}
-
printf("\n");
-
-
-
for(i=1;i<=m;i++)
-
{
-
if(t[i]==1&&t[i+1]==0)
-
{//查找第一个分界点,将这个分界点0变为1,1变为0
-
sum=0;
-
for(a=1;a<i;a++)
-
{//计算分界点前面1的个数,然后从前往后置1
-
sum=sum+t[a];
-
}
-
t[i+1]=1;
-
t[i]=0;
-
for(b=1;b<=sum;b++)
-
{//从1开始置1
-
t[b]=1;
-
}
-
for(b=sum+1;b<i;b++)
-
{//从sum+1开始置0
-
t[b]=0;
-
}
-
for(i=1;i<=m;i++)
-
{//打印t[i]设置为1的i值
-
if (t[i]==1)
-
{
-
printf("%d ",i);
-
}
-
}
-
printf("\n");
-
i=0;//不断的从第一个开始寻找
-
}
-
}
-
}
-
-
-
-
int main ()
-
{
-
int n,m;
-
printf("输入M:");
-
scanf("%d",&m);
-
printf("输入N:");
-
scanf("%d",&n);
-
fulledition(m,n);
-
return 0;
-
}
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/15338739
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)