學習筆記《計算機程序設計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分

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