学习笔记《计算机程序设计C++》第6周中级练习

第6周中级练习
注意,本周练习均是关于递归的,不用递归没有意义(即使可以不用)。
注意,本周练习均是关于递归的,不用递归没有意义(即使可以不用)。
注意,本周练习均是关于递归的,不用递归没有意义(即使可以不用)。

依照学术诚信条款,我保证此作业是本人独立完成的。

温馨提示:

1.本次作业属于Online Judge题目,提交后由系统即时判分。

2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。

1递归插入排序(10分)
题目内容:

编写函数,对整型数组进行递归插入排序。编写函数,输入、输出数组元素。编写主函数,调用函数输入、排序、输出元素。整数个数不超过100个。

输入:在一行或多行中输入若干用空隔开的整数,输入-9999表示结束。

输出:在一行中输出整数,用一个空格隔开,末尾无空格。

输入样例:

3 2 1 5 4 -9999

输出样例:

1 2 3 4 5

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

#include<iostream>
using namespace std;
int const N = 120;
int a[N];

void Insert(int a[], int n){
	int i = n - 1;
	int key = a[n];
	while ((i >= 0) && (key < a[i]))
	{
		a[i + 1] = a[i];
		i--;
	}
	a[i + 1] = key;
	return;
}

void InsertionSort(int a[], int n){
	if (n > 0)
	{
		InsertionSort(a, n - 1);
		Insert(a, n);
	}
	else
		return;
}

int  main()
{
	cin >> a[0];
	int n = 0;
	while (a[n] != -9999) {
		cin >> a[++n];
	}

		InsertionSort(a, n-1);
	cout << a[0];
	for (int i = 1;i < n;i++)
	{
		cout << " " << a[i];
	}
	return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 3ms 360kb
2
用例2通过 3ms 232kb
2
用例3通过 2ms 256kb
2
用例4通过 2ms 256kb
2
用例5通过 2ms 256kb
1
用例6通过 2ms 376kb
1
提交答案本次得分/总分:10.00/10.00分
2递归求两个数的最大公因数(10分)
题目内容:

编写函数,递归求两个整数的最大公因数。编写主函数,输入两个整数,调用函数求最大公因数,在主函数中输出。

输入:两个正整数。

输出:一个整数。

输入输出样例:

输入:

24 42

输出:

6

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

#include<iostream>
using namespace std;
int gcd(int x, int y);
int  main(){
	int x, y, z;
	cin >> x >> y;
	z = gcd(x, y);
	cout << z;
}
int gcd(int x, int y){
	if (x < y)
		return gcd(y, x);
	if (x%y == 0)
		return y;
	return gcd(y, x%y);
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 3ms 256kb
2
用例2通过 3ms 256kb
2
用例3通过 2ms 240kb
2
用例4通过 2ms 364kb
1
用例5通过 2ms 240kb
1
用例6通过 3ms 372kb
1
用例7通过 2ms 256kb
1
提交答案本次得分/总分:10.00/10.00分
3全排列(10分)
题目内容:

编写递归函数,显示n个数字的全排列。例如,n=4,全排列为

1 2 3 4

1 2 4 3

1 3 2 4

1 3 4 2

1 4 3 2

1 4 2 3

2 1 3 4

2 1 4 3

2 3 1 4

2 3 4 1

2 4 3 1

2 4 1 3

3 2 1 4

3 2 4 1

3 1 2 4

3 1 4 2

3 4 1 2

3 4 2 1

4 2 3 1

4 2 1 3

4 3 2 1

4 3 1 2

4 1 3 2

4 1 2 3

编写主函数,输入非负整数n,调用函数显示全排列。

输入格式:一个非负整数n.

输出格式:全排列,每行一个,用一个空格隔开,末尾无空格。

输入样例:

4

输出样例:

1 2 3 4

1 2 4 3

1 3 2 4

1 3 4 2

1 4 3 2

1 4 2 3

2 1 3 4

2 1 4 3

2 3 1 4

2 3 4 1

2 4 3 1

2 4 1 3

3 2 1 4

3 2 4 1

3 1 2 4

3 1 4 2

3 4 1 2

3 4 2 1

4 2 3 1

4 2 1 3

4 3 2 1

4 3 1 2

4 1 3 2

4 1 2 3

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

#include<iostream>
using namespace std;
//交换
void swap(int &a, int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
}
//全排列递归算法
void Perm(int list[], int k, int m)
{
	//list 数组存放排列的数,K表示层 代表第几个数,m表示数组的长度
	if (k == m)
	{
		//K==m 表示到达最后一个数,不能再交换,最终的排列的数需要输出;
		cout << list[1];
		for (int i = 2;i <= m;i++)
			cout << " "<<list[i];
		cout << endl;
	}
	else {
		for (int i = k;i <= m;i++)
		{
			swap(list[i], list[k]);
			Perm(list, k + 1, m);
			swap(list[i], list[k]);
		}
	}
}
int main(){
	int n;
	cin >> n;
	int *a = new int[n];
	for (int i = 1;i <=n;++i)a[i] = i;
	Perm(a, 1, n);
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 3ms 360kb
3
用例2通过 3ms 256kb
3
用例3通过 2ms 360kb
2
用例4通过 3ms 256kb
2
提交答案本次得分/总分:10.00/10.00分
4递归构造可重复字符串(10分)
题目内容:

编写函数,使用递归的方法,递归地构造从顺序的m个字母中抽取n个字母组成的所有字符串。例如,从4个字母中抽取3个组成的字符串为:

AAA

AAB

AAC

AAD

ABA

ABB

ABC

ABD

ACA

ACB

ACC

ACD

ADA

ADB

ADC

ADD

BAA

BAB

BAC

BAD

BBA

BBB

BBC

BBD

BCA

BCB

BCC

BCD

BDA

BDB

BDC

BDD

CAA

CAB

CAC

CAD

CBA

CBB

CBC

CBD

CCA

CCB

CCC

CCD

CDA

CDB

CDC

CDD

DAA

DAB

DAC

DAD

DBA

DBB

DBC

DBD

DCA

DCB

DCC

DCD

DDA

DDB

DDC

DDD

编写主函数,输入整数m和n,调用函数显示构造的字符串。

输入格式:两个整数,分别表示字符数和字符串的长度,用空格隔开。数据均小于10。

输出格式:构造的字符串,每行一个,末尾无空格。

输入样例:

4 3

输出样例:

AAA

AAB

AAC

AAD

ABA

ABB

ABC

ABD

ACA

ACB

ACC

ACD

ADA

ADB

ADC

ADD

BAA

BAB

BAC

BAD

BBA

BBB

BBC

BBD

BCA

BCB

BCC

BCD

BDA

BDB

BDC

BDD

CAA

CAB

CAC

CAD

CBA

CBB

CBC

CBD

CCA

CCB

CCC

CCD

CDA

CDB

CDC

CDD

DAA

DAB

DAC

DAD

DBA

DBB

DBC

DBD

DCA

DCB

DCC

DCD

DDA

DDB

DDC

DDD

(题目来源于网络)

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

#include<iostream>
#include<cstring>
using namespace std;
int n, m;
void per(char buf[], char chs[],int len) {
	if (len == m) {
		cout<<buf<<"\n";
		return;
	}
	for (int i = 0; i < n; i++) {
		buf[len] = chs[i];
		per(buf, chs, len+ 1);
	}
}
int main(){
	cin >> n >> m;
	char a[100];
	for (int i = 0;i < n;++i)a[i] = 'A' + i;
	a[n] = '\0';
	char b[100];
	b[m] = '\0';
	per(b, a, 0);
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 2ms 368kb
2
用例2通过 3ms 372kb
2
用例3通过 3ms 368kb
2
用例4通过 3ms 368kb
2
用例5通过 2ms 376kb
1
用例6通过 15ms 368kb
1
提交答案本次得分/总分:10.00/10.00分
5自然数的拆分(10分)
题目内容:

给定自然数n,将其表示为若干自然数的和,输出所有的解。每组解从小到大排列。数字相同的不同排列算一组解。

输入格式:一个自然数。

输出格式:拆分式,每行一个。

输入样例:

4

输出样例:

4=1+1+1+1

4=1+1+2

4=1+3

4=2+2

4=4

(题目来源于网络)

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

#include<iostream>
using namespace std;
int a[41], s;
void print(int s) {
	for (int i = 1;i <= s - 2;i++)cout<<a[i]<<"+";
	cout<< a[s - 1]<<endl;
}
void search(int n, int s, int pre,int t) {
	if (n == 0 && s > 2) {
		cout << t << "=";
		print(s);//打印
		return;//返回
	}
	for (int i = pre;i <= n;i++) {
		a[s] = i;//每一种
		search(n - i, s + 1, i,t);//类似于递归,搜索下一种可能,若放满则打印
	}
}
int main() {
	int n;
	cin >> n;
	search(n, 1, 1,n);
	cout << n << "="<<n;
	return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 3ms 256kb
2
用例2通过 3ms 256kb
2
用例3通过 2ms 360kb
2
用例4通过 10ms 364kb
1
用例5通过 5ms 256kb
1
用例6通过 2ms 256kb
1
用例7通过 2ms 256kb
1
提交答案本次得分/总分:10.00/10.00分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章