组合数问题 (Mathematics)
题目:
- 描述
- 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入
- 输入n、r。
- 输出
- 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。 - 样例输入
-
5 3
- 样例输出
-
543 542 541 532 531 521 432 431 421 321
- 递归很好解决!
- 为什么是递归?
- f(n,r),确定了第一个数后,剩下的问题就是从其余n-1个数里找r-1个数的组合,即f(n-1,r-1);当第二个参数是1时,说明找到一个组合了,就输出。
- 循环+递归;在纸上画一下程序的执行流程就非常清晰了!
代码:
#include<stdio.h>
void fun(int n,int k);
int a[10];
int main()
{
int n,r;
scanf("%d%d",&n,&r);
a[0] = r;// 保存组合数的长度
fun(n,r);
// system("pause");
return 0;
}
void fun(int n,int k)
{
int i,j;
for(i = n ; i > 0 ; --i)//每个递归里也有这个循环!!!
{
a[k] = i;
if(k > 1 )
fun(i-1,k-1);//递归,不是fun(n-1,k-1),否则会重复的
else
{
for(j = a[0]; j > 0 ; --j)
printf("%d",a[j]);
printf("\n");
}
}
}