描述
找出从自然数1、2、… 、n(0小于n小于10)中任取r(0小于r小于等于n)个数的所有组合。
输入
输入n、r。
输出
按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321
方法一:C++
#include<cstdio>
#include<deque>
using namespace std;
deque<int>q,p;
void search(int n,int r)
{
if(n==r)
{
for(int i=n;i>=1;i--)
{
p.push_back(i);
}
q=p;
for(int i=n;i>1;i--)
{
p.pop_back();
}
while(!q.empty())
{
printf("%d",q.front());
q.pop_front();
}
printf("\n");
return;
}
p.push_back(n);//每次递归确定一位对应的数
if(r==1)
{
q=p;
while(!q.empty())
{
printf("%d",q.front());
q.pop_front();
}
printf("\n");
return;
}
for(int i=n-1;i>=r-1;i--)
{
search(i,r-1);
p.pop_back();
}
}
int main()
{
int n,r;
scanf("%d %d",&n,&r);
for(int i=n;i>=r;i--)
{
search(i,r);
p.pop_back();
}
return 0;
}
方法二:C语言
#include<stdio.h>
int a[100];
int search(int n,int r)
{
for(int i=n;i>=r;i--)
{
a[r]=i;
if(r>1)
{
search(i-1,r-1);
}
else
{
for(int j=a[0];j>0;j--)
{
printf("%d",a[j]);
}
printf("\n");
}
}
return 0;
}
int main()
{
int n,r;
scanf("%d %d",&n,&r);
a[0]=r;
search(n,r);
return 0;
}