第六周基础练习

1.递归计算n!(10分)

题目内容:

编写递归函数,计算n!。在主函数中输入n,调用函数计算n!,在主函数中输出n!。

输入:非负整数。

输出:整数。

【注意】应用递归函数实现,否则没有意义

样例1输入:

6

样例1输出:

720
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int f(int n)
{
	if(n==0||n==1)  return 1;
	return n*f(n-1);
}
int main()
{
	int n;
	cin>>n;
	cout<<f(n)<<endl;
	return 0;
}

2.递归计算1+2+3+…+n(10分)

题目内容:

编写递归函数,计算1+2+3+…+n。在主函数中输入n,调用函数计算1到n的和,在主函数中输出和。

输入:非负整数。

输出:非负整数。

【注意】应用递归函数实现,否则没有意义。输入0时,和为0.

样例1输入:

10

样例1输出:

55
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int sum(int n)
{
	if(n==0)    return 0;
	return n+sum(n-1);
}
int main()
{
	int n;
	cin>>n;
	cout<<sum(n)<<endl;
	return 0;
}

3.递归求数组元素的最大值(10分)

题目内容:

编写递归函数,求数组元素的最大值,函数的输入参数为数组和元素个数,返回最大值。在主函数中输入元素个数和数组元素,调用函数求最大值,在主函数中输出结果。设数组类型为整型,元素不超过100个。

输入:元素个数n和n个元素,用空格或换行隔开。

输出:数组元素最大值。

【注意】使用递归,否则没有意义。

样例1输入:

6

12 1 2 3 14 6

样例1输出:

14
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int mymax(int data[], int n)//前n-1个元素里的最大值与当前元素比较,选大的值
{
	if(n==0)    return data[0];
	int m = mymax(data, n-1);
	if(m<data[n-1])   m = data[n-1];
	return m;
}
int main()
{
	int n;
	int a[100];
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>a[i];
	int m = mymax(a,n);
	cout<<m<<endl;
	return 0;
}

4.递归求数组元素的和(10分)

题目内容:

编写递归函数,求数组元素的和,函数的输入参数为数组和元素个数,返回最大值。在主函数中输入元素个数和数组元素,调用函数求和,在主函数中输出结果。设数组类型为整型,元素不超过100个。

输入:元素个数n和n个元素,用空格或换行隔开。

输出:数组元素和。

【提示】元素个数为0时返回和是0.

样例1输入:

6

1 2 3 4 5 6

样例1输出:

21
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int sum(int data[], int n)//前n-1个元素的和加上当前元素
{
	if(n==0)
		return 0;
	return sum(data,n-1)+data[n-1];
}
int main()
{
	int a[110];
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>a[i];
	cout<<sum(a,n)<<endl;
	return 0;
}

5.递归求Fibonacci序列的第n项(10分)

题目内容:

Fibonacci(费波那契)序列:

f(0)=0

f(1)=1

f(n)=f(n-1)+f(n-2),n=2,3,4,…

编写递归函数,计算Fibonacci序列的第n项(n=0,1,2,3,…)。在主函数中输入n,调用函数计算Fibonacci第n项,在主函数中输出结果。

输入:非负整数

输出:非负整数

【注意】应用递归函数实现。

样例1输入:

6

样例1输出:

8

时间限制:1000ms内存限制:32000kb

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

6.递归逆序数组元素(10分)

题目内容:

编写递归函数,将数组元素逆序,函数的输入参数是数组、起始下标和元素个数。在主函数中输入元素个数和数组元素,调用函数逆序,在主函数中输出结果。设数组类型为整型,元素不超过100个。

输入:元素个数n和n个元素,用空格或换行隔开。

输出:逆序的数组元素,用一个空格隔开,末尾无空格。

【提示】本函数不需返回值。
【注意】必须用递归函数实现,否则没有意义。

样例1输入:

5

1 2 3 4 5

样例1输出:

5 4 3 2 1
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void swap(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
}
void reverse(int a[], int left, int len)//首尾元素交换,直至剩下一个元素
{
	if(len==1||len==0)  return;
	swap(a[left], a[left+len-1]);
	reverse(a, left+1, len-2);
}
int main()
{
	int a[100];
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
		cin>>a[i];
	reverse(a,0,n);
	cout<<a[0];
	for(int i=1; i<n; i++)
		cout<<" "<<a[i];
	cout<<endl;
	return 0;
}

7.输入输出数组元素的函数重载(10分)

题目内容:

函数重载就是定义函数名相同,参数类型或参数个数不同的函数。这些函数称为重载函数。具有重载关系的函数一般具有相同或相似的功能,但作用的对象不同。

编写输入数组元素的重载函数,数组类型分别为int和double,输入-9999时结束输入,返回输入的元素个数。编写输出数组元素的重载函数,数组类型分别为int和double。编写主函数,定义数组,调用函数输入元素,调用函数输出元素。元素个数不超过100个。主函数如下:
见代码
输入:两行。第1行为整型数组元素,第2行为double数组元素,均以-9999表示结束。

输出:两行,第1行为整型数组元素,第2行为double数组元素,以一个空格分隔,末尾无空格。

【提示】print函数中最后输出一个换行。
【注意】不使用重载,无意义。需提交完成程序。

样例1输入:

1 2 3 4 5 6 7 -9999

1.1 1.2 1.3 1.5 1.6 1.6 1.7 1.8 1.9 -9999

样例1输出:

1 2 3 4 5 6 7

1.1 1.2 1.3 1.5 1.6 1.6 1.7 1.8 1.9
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int input(int a[]);
int input(double a[]);
void print(int a[], int len);
void print(double a[], int len);
int main()
{
	int a[100];
	double b[100];
	int lena = input(a);
	int lenb = input(b);
	print(a,lena);
	print(b,lenb);
	return 0;
}
int input(int a[])	
{
	int num;
	int i = 0;
	do			//可用while语句替换
	{
		cin>>num;
		if(num!=-9999)
			a[i++] = num;//先填入元素,再加一
	}while(num!=-9999);
	return i;//i刚好是数组元素个数
}
int input(double a[])
{
	double num;
	int i = 0;
	do
	{
		cin>>num;
		if(num!=-9999)
			a[i++] = num;
	}while(num!=-9999);
	return i;
}
void print(int a[], int len)
{
	cout<<a[0];
	for(int i=1; i<len; i++)
		cout<<" "<<a[i];
	cout<<endl;
}
void print(double a[], int len)
{
	cout<<a[0];
	for(int i=1; i<len; i++)
		cout<<" "<<a[i];
	cout<<endl;
}

8.逆序函数重载(10分)

题目内容:

编写逆序数组元素的重载函数,数组元素类型分别为int和double。编写主函数,定义数组,可以调用上题的函数输入数组元素,调用逆序函数逆序数组元素,可以调用上题函数输出数组元素。注意,不能在逆序函数中输出。数组元素个数不超过100个。主函数如下:

输入:两行。第1行为整型数组元素,第2行为double数组元素,均以-9999表示结束。

输出:两行,第1行为逆序的整型数组元素,第2行为逆序的double数组元素,以一个空格分隔,末尾无空格。

【提示】print函数中最后输出一个换行。

【注意】不使用重载,无意义。

样例1输入:

1 2 3 4 5 6 7 8 -9999

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 -9999

样例1输出:

8 7 6 5 4 3 2 1

1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1
时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int input(int a[]);
int input(double a[]);
void reverse(int a[], int len);
void reverse(double a[], int len);
void print(int a[], int len);
void print(double a[], int len);
int main()
{
	int ai[100];
	double ad[100];
	int ni, nd;
	ni = input(ai);
	nd = input(ad);
	reverse(ai,ni);
	reverse(ad,nd);
	print(ai,ni);
	print(ad,nd);
	return 0;
}
int input(int a[])
{
	int num;
	int i=0;
	do
	{
		cin>>num;
		if(num!=-9999)
			a[i++] = num;
	}while(num!=-9999);
	return i;
}
int input(double a[])
{
	double num;
	int i=0;
	do
	{
		cin>>num;
		if(num!=-9999)
			a[i++] = num;
	}while(num!=-9999);
	return i;
}
void reverse(int a[], int len)//转置函数没用递归,因为递归复杂度比较高
{
	for(int i=0; len>1; i++)//首尾交换,思路与上面相同
	{
		int temp = a[i];
		a[i] = a[i+len-1];
		a[i+len-1] = temp;
		len-=2;
	}
}
void reverse(double a[], int len)
{
	for(int i=0; len>1; i++)
	{
		double temp = a[i];
		a[i] = a[i+len-1];
		a[i+len-1] = temp;
		len-=2;
	}
}
void print(int a[], int len)
{
	cout<<a[0];
	for(int i=1; i<len; i++)
		cout<<" "<<a[i];
	cout<<endl;
}
void print(double a[], int len)
{
	cout<<a[0];
	for(int i=1; i<len; i++)
		cout<<" "<<a[i];
	cout<<endl;
}

9.数组元素求和函数的重载(10分)

题目内容:

编写数组元素求和的重载函数,数组元素类型分别为int和double。编写主函数,定义数组,可以调用前面的函数输入数组元素,调用求和函数求和,在主函数中输出结果。数组元素个数不超过100个。主函数如下:

输入:两行。第1行为整型数组元素,第2行为double数组元素,均以-9999表示结束。

输出:一个整数和,一个实数和,用空格隔开。

【注意】不使用重载,无意义。

样例1输入:

1 2 3 4 5 6 7 8 9 10 -9999

1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 -9999

样例1输出:

55 13.5

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
int input(int a[]);
int input(double a[]);
int mysum(int a[], int len);
double mysum(double a[], int len);
int main()
{
	int ai[100];
	double ad[100];
	int sumi;
	double sumd;
	int ni=input(ai);
	int nd=input(ad);
	sumi = mysum(ai,ni);
	sumd = mysum(ad,nd);
	cout<<sumi<<" "<<sumd<<endl;
	return 0;
}
int input(int a[])
{
	int i=0;
	int num;
	do
	{
		cin>>num;
		if(num!=-9999)
			a[i++] = num;
	}while(num!=-9999);
	return i;
}
int input(double a[])
{
	int i=0;
	double num;
	do
	{
		cin>>num;
		if(num!=-9999)
			a[i++] = num;
	}while(num!=-9999);
	return i;
}
int mysum(int a[], int len)
{
	int sum = 0;
	for(int i=0; i<len; i++)
		sum += a[i];
	return sum;
}
double mysum(double a[], int len)
{
	double sum = 0;
	for(int i=0; i<len; i++)
		sum += a[i];
	return sum;
}

10.交换两个元素值的重载函数(10分)

题目内容:

编写交换两个元素值的重载函数,两个元素会是两个整数、两个实数、两个整型数组、两个char型字符串。编写主函数,定义有关变量、数组,输入数据,调用函数,输出交换结果。数组元素不超过100。主函数如下 (其中print(是前面编写的显示数组元素的函数):

输入:5行;分别是两整数,两实数,数组1,数组2,两个字符串。见样例输入。其中数组行的第1个数是元素个数。

输出:5行,交换的结果,见样例输出。

【注意】不能使用系统的字符串处理库函数,不使用string。可以自定义需要的函数。

【提示】整数、实数的交换使用参数的引用传递;数组的交换,元素个数的交换使用引用传递。

样例1输入:

2 3

1.2 1.81

3 1 2 3

8 81 82 83 84 85 86 87 88

input output

样例1输出:

3 2

1.81 1.2

81 82 83 84 85 86 87 88

1 2 3

output input

时间限制:500ms内存限制:32000kb

#include <iostream>
using namespace std;
void swap(int &a, int &b);
void swap(double &a, double &b);
void swap(int a[], int &lena, int b[], int &lenb);
void swap(char st1[], char st2[]);
void print(int a[], int len);
void print(double a[], int len);
int main()
{
	int a, b;
	double da, db;
	int aa[100], ab[100];
	char s1[100], s2[100];
	int n, m;
	int i;
	//输入
	cin>>a>>b;
	cin>>da>>db;
		//输入数组
	cin>>n;
	for(i=0; i<n; i++)
	{
		cin>>aa[i];
	}
	cin>>m;
	for(i=0; i<m; i++)
	{
		cin>>ab[i];
	}
	cin>>s1>>s2;
	//交换
	swap(a,b);
	swap(da,db);
	swap(aa,n,ab,m);
	swap(s1,s2);
	//输出
	cout<<a<<" "<<b<<endl;
	cout<<da<<" "<<db<<endl;
	print(aa,n);
	print(ab,m);
	cout<<s1<<" "<<s2<<endl;
	return 0;
}
void swap(int &a, int &b)//用的引用,没有用指针
{
	int temp = a;
	a = b;
	b = temp;
}
void swap(double &a, double &b)
{
	double temp = a;
	a = b;
	b = temp;
}
void swap(int a[], int &lena, int b[], int &lenb)//要交换实际的值
{
	int maxLen = lena;
	if(maxLen<lenb)    maxLen = lenb;//选最大的数组长度,可以用库函数
	for(int i=0; i<maxLen; i++)
		swap(a[i], b[i]);
	swap(lena,lenb);//交换完数组后,要交换数组长度
}
void swap(char st1[], char st2[])
{
	char *p = st1;
	char *q = st2;
	while(*p||*q)//和交换数组时思路一样,两种表达方式,都表示用最大长度
	{
		char ch = *p;
		*p = *q;
		*q = ch;
		p++;
		q++;
	}
	*p = 0;//交换完成之后,把字符串末尾变成0
	*q = 0;
}
void print(int a[], int len)
{
	cout<<a[0];
	for(int i=1; i<len; i++)
		cout<<" "<<a[i];
	cout<<endl;
}
void print(double a[], int len)
{
	cout<<a[0];
	for(int i=1; i<len; i++)
		cout<<" "<<a[i];
	cout<<endl;
}
发布了28 篇原创文章 · 获赞 38 · 访问量 7181

猜你喜欢

转载自blog.csdn.net/weixin_45543556/article/details/104917129
今日推荐