给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合

如题,给定n为5,则这n个数为{1,2,3,4,5},给定k为2,

则所有的可能组合为:

{1,2}、{1,3}、{1,4}、{1,5}、{2,3}、{2,4}、{2,5}、{3,4}、{3,5}、{4,5}

而且我们经常是按照这种顺序来寻找所有的可能性,那么如何按照这个逻辑编程实现呢?

从上面的序列中,我们可以发现,相邻的两个数是有一定的关系的,

例如以1开头的组合中,第二个数字是递增的,而且可以知道在所有组合中{1,...,k}肯定是第一个

组合,而{n-k+1,...,n}肯定是最后一个组合,而且以n-k+1开头的组合也只有一个,即这个组合标志

着整个寻找过程结束。所以,我们可以从第一个组合开始,一直与最后一个组合比较,循环找出所有组合。

/***************************************************
*filename: AllChose.c
*date:     2014/3/30
*author:   Yuqiang HAN
*version:  v1.0
***************************************************/

#include<stdio.h>

#define MAX 100

/*************************
*function:  AllChose
*input:     n  给定数字的个数
*			k  选择数字的个数
*return		none
**************************/
void AllChose(int n, int k)
{
	if(n < k || n <= 0 || k <= 0)
	{
		return;
	}

	int i;
	int j;
	int count = 1;
	int arr[MAX];
	int index[MAX];

	for(i = 1; i <= k; i++)
	{
		arr[i] = i;
		index[i] = n-k+i;
	}

	while(true)
	{
		printf("第#count个组合为:\n", count++);
		for(i = 1; i <=k; i++)
		{
			printf("%d ",arr[i]);
		}
		printf("\n");

		if(arr[1] == n-k+1)   //判断是否到了最后一个组合
		{
			break;
		}

		for(i = k; i >= 1; i--)
		{
			if(arr[i] < index[i])
			{
				arr[i]++;
			
				for(j = i+1; j <= k; j++)
				{
					arr[j] = arr[j-1] + 1;
				}
				break;
			}
		}
	}
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值