组合数
来源:互联网 发布:浙江软件行业协会 编辑:程序博客网 时间:2024/06/03 07:05
找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
- 输入
输入n、r。
- 输出
- 按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543
542
541
532
531
521
432
431
421
321思路:搜索题写的不多,特别是深搜,有些迷,本题的代码很简洁,但我也琢磨了好久,然后在本题的基础上拓展一下,输出每一个组合中的值从小到大排列,组合之间按字典序排列。详情见代码二。试着比较理解一下两个代码不同之 处。
代码一:
#include<stdio.h>
int s[10];
void DBF(int n,int r)
{
int i,j;
for(i=n;i>0;i--)
{
s[r]=i;
if(r>1)
{
DBF(i-1,r-1);
}
else
{
for(j=s[0];j>=1;j--)//因为r在不断的变化,所以用数组的第一个位置来保存位数
{
printf("%d",s[j]);
}
printf("\n");
}
}
}
int main()
{
int n,r;
scanf("%d%d",&n,&r);
s[0]=r;//存位数,留着输出时做为条件控制
DBF(n,r);
return 0;
}代码二:
#include<stdio.h>
int s[10];
int n;//让n作为全局变量
void DBF(int x,int r)
{
int i,j;
for(i=x;i<=n;i++)
{
s[r]=i;
if(r>1)
{
DBF(i+1,r-1);//注意:是i加1,不是x。
}
else
{
for(j=s[0];j>=1;j--)
{
printf("%d",s[j]);
}
printf("\n");
}
}
}
int main()
{
int r;
scanf("%d%d",&n,&r);
s[0]=r;
DBF(1,r);
return 0;
}
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 组合数
- 工作日记2017.07.17
- 简易Java web在线聊天-websocket
- E
- 正则表达式
- C++:1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。
- 组合数
- 面试常见问题——架构
- Python定时任务的启动和停止
- Android视频背景,动态背景
- 循环链表处理约瑟夫环
- 17. 排序--希尔排序
- 【Nova】部署学习
- C/C++ 生成随机数
- Android Volley完全解析(三),定制自己的Request