64,691
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
bool input_data(unsigned int* n, unsigned int* m)
{
printf("Please input N: ");
scanf("%u", n);
printf("Please input M: ");
scanf("%u", m);
if(*n >= *m) return true;
else return false;
}
void print(unsigned int* n, unsigned int len)
{
for(int i=0; i<len; ++i) printf("%u ", n[i]);
printf("\n");
}
void generate_it(unsigned int prefix[],
unsigned int nums[],
unsigned int n,
unsigned int m,
unsigned int result[],
unsigned int len)
{
if(m==1) {
for(int i=0; i<n; ++i) {
prefix[0] = nums[i]; //得到一解
print(result, len);
}
}
else {
for(int i=0; i<n-m+1; ++i) {
prefix[0] = nums[i]; //动态化规
generate_it(prefix+1, nums+i+1, n-i-1, m-1, result, len);
}
}
}
void generate_combination(unsigned int n, unsigned int m)
{
if(m==0) m=1;
unsigned int* nums = (unsigned int*) malloc(n*sizeof(unsigned int));
unsigned int* prefix = (unsigned int*) malloc(m*sizeof(unsigned int));
for(int i=0; i<n; ++i) nums[i] = i+1;
if(n==m) {
print(nums, n);
return;
}
else generate_it(prefix, nums, n, m, //下一行两个参数用来保存结果
prefix, m);
free(nums);
free(prefix);
}
int main()
{
/*由于是做题,所以仅仅显示答题,没有
* 保存,保存也不难,只是用C太麻烦了
* C++方便些。思想是对每个数为开头递归
* */
unsigned int n,m;
if(input_data(&n, &m)) generate_combination(n, m);
else printf("Input ERROR!\n");
return 0;
}