如题,给定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;
}
}
}
}