2020广西大学期末C语言题库–输出组合题解
题目提炼:从1、2、3……n中选r个数字(不分顺序),组成一个组合。
输出要求:用递归的方法从小到大输出所有组合
关键点解释:
不分顺序:每个组合的r个数字不能重复。ps->123/321重复。
所以,就是输出C r(上)n(下)–这是一个数学符号–的所有情况
#include<stdio.h>
long long n, r,arr[50000];/*arr数组作为空间容器:比如123,用arr[1]=1,
arr[2]=2,arr[3]=3来承装。*/
递归函数主体:
void func ( long long step,long long t ) {
//step是表示第几个数,step=1表示r个数字的第一个数字
if ( step == r+1 )//边界条件:已选出r个数,输出
{
for ( int j = 1; j <= r; j++ )
printf ( "%lld", arr[j] );
printf ( "\n" );
return;//返回最近的一次调用函数
}
for ( long long i = t+1; i <= n-r+step; i++ )//i从t+1开始,就是从比上一位大的数字里选择:1__,第二位要选择比1大的,防止重复
{
arr[step] = i;//给第step位数赋值
func ( step + 1, i );//递归,对下一位操作
}
return;//返回最近的一次调用函数
}
主函数:
int main ()
{
long long k;
scanf ( "%lld", & k );//k组数据
while ( k-- )
{
scanf ( "%lld %lld", &n, &r );
func ( 1, 0 );//选对第一个数的位置操作,因为从1~n,所以t=0.
}
return 0;
}
粗略过程图片:
总代码:
#include<stdio.h>
long long n, r,arr[50000];
void func ( long long step,long long t ) {
if ( step == r+1 )
{
for ( int j = 1; j <= r; j++ )
printf ( "%lld", arr[j] );
printf ( "\n" );
return;
}
for ( long long i = t+1; i <= n-r+step; i++ )
{
arr[step] = i;
func ( step + 1, i );
}
return;
}
int main ()
{
long long k;
scanf ( "%lld", & k );
while ( k-- )
{
scanf ( "%lld %lld", &n, &r );
func ( 1, 0 );
}
return 0;
}