JG-OJ记录143:2020级cpp上机练习题第15次(函数重载、递归函数)

效率太慢了一章一题,题目各有难易,这一版只放关键代码段(PS:重载题也是用的模板,重载其实也没人看吧QWQ)

因为递归算是很重要的一环,所以我就没把所有代码放出来,能独立完成递归才是你进来这篇文章的目的,希望你能看到最后(大佬就不用看了

1:函数(重载)-1

描述

通过重载函数(overloaded function),实现计算两点之间的距离。

第一个重载接受4个int类型参数,把前两个参数看成一个点的坐标,后两个参数看成另一个点的坐标,函数返回两点之间的距离(浮点数)。

第二个重载接受4个double类型参数,把前两个参数看成一个点的坐标,后两个参数看成另一个点的坐标,函数返回两点之间的距离(浮点数)。

主函数中分别输入两组值,调用函数输出结果。

输入

一共有8个数字。

首先是四个浮点数a、b、c、d

然后是四个整数e、f、g、h

输出

先输出点(a,b)到点(c,d)的距离,换行。

然后输出点(e,f)到点(g,h)的距离,换行。

输出结果与标准答案相差0.001之内即可。

样例输入 复制样例

1.5 3.5 5.5 7.5

3 4 5 6

样例输出

5.65685

2.82843

HINT
 

关键

template<class T>
double f(T a,T b,T c,T d)
{
	double n=(a-c)*(a-c)+(b-d)*(b-d);
	n=sqrt(n);
	cout<<n<<endl;
	return 0;
}

 

2:函数(重载)-2

描述

通过重载函数(overloaded function),返回两个数字的相减结果。

第一个重载接受2个int类型参数,函数返回两个数字的相减结果(整数)。

第二个重载接受2个double类型参数,函数返回两个数字的相减结果(浮点数)。

主函数中分别输入两组值,调用函数输出结果。

输入

一共有4个数字。

首先是两个浮点数a、b

然后是两个整数c、d

输出

先输出a-b的值,换行。

然后输出c-d的值,换行。

样例输入 复制样例

3.5 2.3

3 1

样例输出

1.2

2

HINT
 

 关键:

template<class T>
T f(T a,T b)
{
	return a-b;
}

 

3:函数(重载)-3

描述

通过重载函数(overloaded function),返回三个参数中较大的参数。

第一个重载接受2个int类型参数,函数返回三个数字中较大的数(整数)。

第二个重载接受2个double类型参数,函数返回三个数字中较大的数(浮点数)。

主函数中分别输入两组值,调用函数输出结果。

 

输入
一共有6个数字。

首先是三个浮点数a、b、c

然后是三个整数d、e、f

输出

先输出a、b、c的最大值,换行。

然后输出d、e、f的最大值,换行。

可能需要嵌套调用函数。

样例输入 复制样例

1.5 2.5 3.5

3 2 1

样例输出

3.5

3

HINT

 

关键:

template<class T>
T ff(T a,T b,T c)
{
	T max;
	if(a>b) max=a;
	else max=b;
	if(c>max) max=c;
	return max;
}

 

4:函数(递归)-1 

描述

m块饼每天吃1块或者2块,吃到完为止。问有多少种不同的吃法。注意:第1天吃2块第2天吃1块和第1天吃1块第2天吃2块,是两种不同的吃法。

输入

一个正整数n,表示n组案例。

每组案例由一个正整数m构成。(m<=20)

输出

针对每组案例,输出共有多少种吃完的方法。

每组案例输出完都要换行。

样例输入 复制样例

1

10

样例输出

89

HINT
 

解:一题基础递归,要搞清楚结束递归的条件,和递归里面的内容(毕竟每次都是调用该函数) ,如果递归有出现错误,请手动计算每次递归程序的结果进行比较,不要和我一样做懒狗。

关键:

int ts(int a,int b)
{
	//cout<<a<<" "<<b<<endl; 
	if(a==0)
	{
		//cout<<"Sum++"<<endl;
		Sum++;
		return 0; 
	}
	else
	{
		if(a-1>=0)
		ts(a-1,1);
		if(a-2>=0)
		ts(a-2,2);
	}
}

可以看到被我注释掉的输出,就是用来除错的

 

5:函数(递归)-2

描述

m块饼每天吃2块或者3块(注意:不能吃1块),吃到完为止。问有多少种不同的吃法。

输入

一个正整数n,表示n组案例。

每组案例由一个正整数m构成。(m<=20)

输出

针对每组案例,输出共有多少种吃完的方法。

每组案例输出完都要换行。

样例输入 复制样例

1

10

样例输出

7

HINT
 

基本和4没区别 

关键:

int ts(int a,int b)
{
	//cout<<a<<" "<<b<<endl; 
	if(a==0)
	{
		//cout<<"Sum++"<<endl;
		Sum++;
		return 0;
	}
	else
	{
		if(a-2>=0)
		ts(a-2,2);
		if(a-3>=0)
		ts(a-3,3);
	}
}

 

 6:函数(递归)-3

描述

m块饼分p天吃完,每天吃1块或者2块。问有多少种不同的吃法。

输入

一个正整数n,表示n组案例。

每组案例由两个正整数m和p构成。(m<=20,p<=20)

输出

针对每组案例,输出共有多少种吃完的方法。

每组案例输出完都要换行。

样例输入 复制样例

1

10 7

样例输出

35

HINT
 

比起4、5更有难度 

关键: 

int Sum=0,st=0;
int ts(int a,int b,int p)
{
	//cout<<a<<" "<<b<<endl; 
	//cout<<a<<" "<<p<<" "<<st<<endl; 
	if((a==0)&&(st==p))
	{
		//cout<<"Sum++"<<endl;
		Sum++;
		st--;
		return 0;
	}
	else
	{
		if(a-1>=0)
		{
			st++;
			ts(a-1,1,p);
		}
		if(a-2>=0)
		{
			st++;
			ts(a-2,2,p);
		}
	}
	if(b!=0)
	{
		st--;return 0;
	}
}

 

7:函数(递归)-4 

描述

编写递归函数将输入的整数逐个数字输出。如输入12345,输出1 2 3 4 5,每个数字之间用空格隔开。
 

输入

一个正整数n,表示n组案例。

每组案例由一个正整数m构成。

输出

针对每组案例,将输入的整数逐个数字输出,每个数字之间用空格隔开,最后一位数字后面没有空格。

每组案例输出完都要换行。

样例输入 复制样例

1

12345

样例输出

1 2 3 4 5

HINT
 

关键:

int t;
int f(int a,int b)
{
	if(b==0) return 0;
	int c=pow(10,b-1);
	if(b==t)
	{
		cout<<a/c;
	}
	else
	{
		cout<<" "<<a/c;
	}
	b--;
	a=a-(a/c)*c;
	return f(a,b);
}

----------int main里每组案例中--------------
		cin>>m;
		int p=m;
		for(int j=1;;j++)
		{
			p=p/10;
			if(p==0)
			{
				t=j;
				break;
			}
		}

 

8:函数(递归)-5 

 

描述
编写递归函数将输入的整数逐个数字反序输出。如输入12345,输出5 4 3 2 1,每个数字之间用空格隔开。
输入
 
输出

针对每组案例,将输入的整数逐个数字反序输出,每个数字之间用空格隔开,最后一位数字后面没有空格。

每组案例输出完都要换行。

样例输入 复制样例

1

12345

样例输出

5 4 3 2 1

HINT
 

关键:

int f(int a)
{
	if(a==0)
	{
		cout<<endl;
		return 0;
	}
	else
	{
		if(a<=10) cout<<a%10;
		else cout<<a%10<<" ";
	}
	a=a/10;
	return f(a);
}

 

9:函数(递归)-6 

描述

编写递归函数将输入的整数逐个数字输出,每个数字之间用空格隔开,并且数字为几就应该有几个空格。

例如输入12345,则输出1 2  3   4    5     ,其中1后面有1个空格,2后面有2个空格,…,5后面有5个空格。

输入

一个正整数n,表示n组案例。

每组案例由一个正整数m构成。

输出

针对每组案例,将输入的整数逐个数字输出,每个数字之间用空格隔开,并且数字为几就应该有几个空格。

每组案例输出完都要换行。

样例输入 复制样例

1

12345

样例输出

1 2  3   4    5    

 

HINT
 

关键:

int f(int a,int b)
{
	if(a==0) return 0;
	else
	{
	int c=pow(10,b+1);
	b--;
	cout<<a/c;
	for(int i=1;i<=a/c;i++)
	{
		cout<<" ";
	}
	a=a-a/c*c;//去除首位
	}
	return f(a,b);
	
}

 --------------------------------------------------------- --------------------------------------------------------- --------------------------------------------------------- --------------------------------------------------------- 

这边展示第四题简化的代码

#include<iostream>
using namespace std;
int f(int m)
{
	int x;
	if(m<0) return 0;
	if(m==0) return 1;
	else x=f(m-1)+f(m-2);
	return x;
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int m;
		cin>>m;
		cout<<f(m)<<endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值