首页
社区
课程
招聘
[讨论]C实现在一个N大数组取M个元素组合
发表于: 2014-5-19 02:11 3679

[讨论]C实现在一个N大数组取M个元素组合

2014-5-19 02:11
3679
/*
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 结束

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2242
活跃值: (488)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
2
大概意图看出楼主是要从N个元素集合取M个不同元素组合

如果是这样的话,楼主的输出结果明显不对,实在没看懂楼主代码,所以自己简单写了一下

void combination(char strArray[], int n) {
	int z = strlen(strArray);
	int s[10];
	int i,j;

	for (i = 0;i < n; ++i) s[i] = i;

	while (s[0] != z) {
		//输出当前组合
		for (i = 0; i < n; ++i) {
			printf("%c", strArray[s[i]]);
		}
		printf("\n");

		bool next;
		do {
			next = false;

			//获得下个组合
			++s[n-1];
			for (i = n - 1; i ; --i) {
				if (s[i] != z) 
					break;
				++s[i-1];
				s[i]=0;
			}

			//过滤掉有相同元素的
			for (i = 0; i< n; ++i) {
				for (j = i + 1; j < n; ++j) {
					if (s[i] == s[j]) {
						next = true;
						break;
					}
				}
			}
		} while (next);
	}
}
2014-5-19 05:18
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
注释和变量名。 还是稍微注意一点。  其他人看代码很累的。跟F5的一样。
2014-5-19 09:05
0
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=疯子;1285649]大概意图看出楼主是要从N个元素集合取M个不同元素组合

如果是这样的话,楼主的输出结果明显不对,实在没看懂楼主代码,所以自己简单写了一下

void combination(char strArray[], int n) {
        int z = strlen(strArray);
...[/QUOTE]

我的输出结果是正确的 仁兄能说下实现的思路么
2014-5-19 11:53
0
游客
登录 | 注册 方可回帖
返回
//