2020广西大学期末C语言题库--输出组合题解

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_51550966/article/details/112338773
今日推荐