-
-
[讨论]C实现在一个N大数组取M个元素组合
-
发表于:
2014-5-19 02:11
3575
-
/*
N个元素取M个元素组合 C语言版
2014年5月19日
新手求指导如何优化修改
*/
#include <stdio.h>
#include <windows.h>
void combination(char strArray[], int n);
int main(void)
{
char strArray[] = "01234";
combination(strArray, 3);
system("pause");
return 0;
}
/*
012
013
014
023
024
034
123
124
134
234
请按任意键继续. . .
求指导优化修改(至于M是不是大于N不考虑只是要思路)
*/
void combination(char strArray[], int n)
{
int z = strlen(strArray) - 1;
int s[10];
int i, p, k;
for(i = 0; i < n; i++)
{
s[i] = i;
printf("%c", strArray[i]);
}
printf("\n");
p = k = (n - 1);
while(p >= 0) //p先指向s的最后一位
{
while(k >= p) //k指向需要自增的位 但不能跑到p前边
{
while(s[k] <= z-n+k) //这里主要是限制 s里的元素是向后递增的
{
if(k < n -1) //这里如果k指向的是s最后一个元素之前的时候 是一个路过的过程,依次自增1
{
s[k]++;
k++;
}
else //这里k就又指向s最后一个元素了 到这里说明这一轮完了 把M个元素打印出来
{
s[k]++;
for(i = 0; i < n; i++)
{
printf("%c", strArray[s[i]]);
}
printf("\n");
}
}
k--; //k从最后一位向前移一位
if(k >= 0) //如果没有向前移出s 下边主要是初始化
for(i = k; i < n-1; i++)
s[i+1] = s[i] + 1;
}
p--;
}
}
我的实现思路是这样的 在combination函数里边
定义一个s数组用来存放取M个元素,这个数组里边存放的是N个元素数组的下标
第一次从前到后取M个元素0,1,2,3....M,
然后p变量先指向数组最后一个元素 开始是012最后一个元素为s[2]开始自增013一直到N个元素最后变成014,k与p同时指向最后一个元素k自减就跑p前边了不成立初始化后变成012 p向前移一位结合k变成023 024最后一个元素到N了k向前移一位继续 034后两个元素都到达极限了 p再向前移一位指向0 结合k 123 124 134 234 结束
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课