C++算法与设计学习记录

目录

题目 A: 数组排序

题目描述

输入

输出

样例输入

样例输出

代码

题目 B: n!的尾部0的个数

题目描述

输入

输出

样例输入

样例输出

代码

题目 C: 录取加分

题目描述

输入

输出

样例输入

样例输出

代码

题目 D: 区间内素数个数

题目描述

输入

输出

样例输入

样例输出 

代码

题目 E: x的n次方(Python)

题目描述

输入

输出

样例输入

样例输出

代码

题目 F: 猴子跳台阶

题目描述

输入

输出

样例输入

样例输出

代码

题目 G: 骨牌铺方格

题目描述

输入

输出

样例输入

样例输出

代码

题目 H: 求一个数列的最大项

题目描述

输入

输出

样例输入

样例输出

代码


题目 A: 数组排序

题目描述

任意给定整数n,及一组由n个元素构成的数a1、a2、a3、…、an, 你的任务是对这n个数进行排序。

输入

有若干组测试数据。每一组测试数据由2行组成,其第1行上有一个整数n,(1≤n≤1000),第2行上有n个整数,表示你要对这n个数进行排序。

输出

对输入中的每一组待排序的数据,输出该数组经从小到大排序后的数组元素,元素之间有一个空格,尾部无多余空格。

样例输入

3
25 2 5
17
23 949 123 23 334 12 245 3 45 66 21 -34 5 6 7 22 34

样例输出

2 5 25
-34 3 5 6 7 12 21 22 23 23 34 45 66 123 245 334 949

代码

#include<iostream>
using namespace std;

void kp(int a[][1000], int i, int j, int n) {
	if (i > j)
		return;
	int temp = a[n][i];
	int l = i;
	int r = j;
	while (i != j) {
		while (i < j && a[n][j] >= temp)
		{
			j--;
		}
		a[n][i] = a[n][j];
		while (i < j && a[n][i] <= temp)
		{
			i++;
		}
		a[n][j] = a[n][i];
	}
	a[n][i] = temp;
	kp(a, l, i - 1, n);
	kp(a, i + 1, r, n);
}
int main() {
	static int a[100][1000] = { 0 };
	static int n[100];
	int i = 0, s = 0;
	while (cin>>n[i]) {
		s++;
		for (int k=0; k < n[i];k++) {
			cin >> a[i][k];
		}
		i++;
	}

	for (int o = 0; o < s; o++) {
		kp(a, 0, n[o] - 1, o);
		for (int p = 0; p < n[o]; p++) {
			if (p != n[o] - 1)
				cout << a[o][p] << " ";
			else
				cout << a[o][p];
		}
		cout << endl;
	}
	return 0;
}

题目 B: n!的尾部0的个数

题目描述

给定一个正整数n,计算n!的尾部0的个数。

输入

输入数据有若干行。每行上有一个正整数n,(0<n<32767),对应一种情形。

输出

对于每一种情形,先输出“Case #: ”(#为数据序号,从1起),然后输出n的值,逗号,结果,换行。

样例输入

8
20
100

样例输出

Case 1:8,1
Case 2:20,4
Case 3:100,24

代码

#include<iostream>
using namespace std;
int count0(int n) {
	int count = 0;

	while (n != 0) {
		count += n / 5;
		n = n / 5;
	}
	return count;
}
int main() {
	static int n[1000];
	int i = 0;
	while (cin>>n[i]) {
		i++;
	}
	for (int j = 0; j < i; j++) {
		cout << "Case " << j + 1 << ":" << n[j] << "," << count0(n[j]) << endl;
	}
}

题目 C: 录取加分

题目描述

       某公司招聘员工,规定凡是获得某个职业认证证书或某个竞赛奖项的应聘人员具有面试加分30参与排名的优先权。现有一组应聘人员的卷面测试成绩,有些应聘人员具有加分资格,有些则没有。现要求所有这些应聘人员加分处理后进行从高到低的排队。

输入

       输入有多组数据。每组第一行上有一个整数n,(1≤n≤30),表示要参加应聘人员数。接着有n行,每行有两个整数s,f,其中s表示该应聘者的卷面测试分数,f表示是否具有加分30分的资格,如果f=1表示该人有加30分资格,f=0表示无加分资格。

输出

对输入中的每组数据,从高到低输出经过加分处理后的分数数据,数据之间有一个空格,尾部无多余空格。

样例输入

3
673 1
578 0
630 1
5
582 0
580 1
578 1
580 0
575 0

样例输出

703 660 578
610 608 582 580 575

代码

#include<iostream>
using namespace std;

void kp(int a[], int i, int j) {
	if (i > j)
		return;
	int temp = a[i];
	int l = i;
	int r = j;
	while (i != j) {
		while (i < j && a[j] <= temp)
		{
			j--;
		}
		a[i] = a[j];
		while (i < j && a[i] >= temp)
		{
			i++;
		}
		a[j] = a[i];
	}
	a[i] = temp;
	kp(a, l, i - 1);
	kp(a, i + 1, r);
}
int main() {
	static int n[1000],s[1000];
	int i = 0, sum = 0, f;
	while (cin >> n[i]) {
		if (n[i] > 30 || n[i] < 1)
			return 1;
		for (int j = sum; j < sum+n[i]; j++) {
			cin >> s[j];
			cin >> f;
			if (f == 1)
				s[j] += 30;
		}
		sum = sum + n[i];
		i++;
	}
	sum = 0;
	for (int p = 0; p < i; p++) {
		kp(s, sum, sum + n[p]-1);
		for (int q = sum; q < sum + n[p]; q++) {
			if (q != sum + n[p] - 1)
				cout << s[q] << " ";
			else
				cout << s[q];
		}
		cout << endl;
		sum = sum + n[p];
	}
	return 0;
}


题目 D: 区间内素数个数

题目描述

给定正整数a,b,输出两个正整数a,b之间(包括a,b)的全部素数。

输入

先输入一个正整数T,代表需要处理的区间对数,接下来T行,每行输入两个正整数a,b(a<b<1000),代表要统计素数的区间范围。

输出

对每一对区间,按从小到大顺序一行输出该区间内的全部素数。

样例输入

2
200 300
2 9

样例输出 

211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293
2 3 5 7

代码

#include<iostream>
using namespace std;
bool panduan(int n) {
	if (n > 1) {
		for (int i = 2; i < n; i++) {
			if (n % i == 0)
				return false;
		}
		return true;
	}
	else {
		return false;
	}
}

int main() {
	int T;
	cin >> T;
	int* a = new int[T];
	int* b = new int[T];
	for (int i = 0; i < T; i++) {
		cin >> a[i];
		cin >> b[i];
	}
	for (int i = 0; i < T; i++) {
		for (int j = a[i]; j <= b[i]; j++) {
			if (j != b[i] && panduan(j))
				cout << j << " ";
			else if (panduan(j))
				cout << j;
		}
		cout << endl;
	}
	delete[]a;
	delete[]b;
	return 0;
}

题目 E: x的n次方(Python)

题目描述

计算一任意数x的n次方,即 y=xn   (n>=0,x>0).

输入

第 1 行给出正整数 T,是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出整数 x 和 n(0<x<100,0<=n<1000)。整数间以空格分隔。

输出

对每组测试用例,在一行中输出结果y。由于数据比较大,请输出y%10007的值。

样例输入

2
3 5
2 8

样例输出

243
256

代码

T=int(input())
x=[]
n=[]
y=[]

for i in range(0,T,1):
    temp = []
    temp=list(map(int,input().split()))
    x.append(temp[0])
    n.append(temp[1])
    y.append(int(x[i])**int(n[i]))
for i in range(0,len(y)):
    print(str(y[i] % 10007))

题目 F: 猴子跳台阶

题目描述

猴子要爬n级台阶。假设猴子一步可以跳1级或3级台阶。问n级台阶有多少种不同的跳法。

输入

有多组数据,每组一行,其上有一个整数n(0<n<=30)。

输出

对输入的每个整数n,输出n级台阶的不同跳法数Fn。数据Fn。可能比较大,只需输出模100007的值Fn(mod 100007) 。

样例输入

3
4

样例输出

2
3

代码

#include<iostream>
using namespace std;
long long res(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    if (n == 3) {
        return 2;
    }
    int sum = 0;
    if (n > 3) {
        sum = res(n - 1) + res(n - 3);
    }
    return sum;
}

int main() {
    int n[100];
    long long fn[100];
    int i = 0;
    while (cin >> n[i]) {
        fn[i] = res(n[i]);
        i++;
    }
    for (int j = 0; j < i; j++) {
        cout << fn[j] % 100007 << endl;
    }
	return 0;
}

题目 G: 骨牌铺方格

题目描述

有 2×n的一个长方形方格,用一个1*2的骨牌铺满方格。问对给出的任意一个n(n>0), 铺法总数有多少种?

输入

有多组数据,每组一行,其上有一个整数n(0<n<=40)。

输出

对输入的每个整数n,输出2×n的方格用1*2型铺满的不同方法总数Fn。数据Fn可能比较大,只需输出模100007的值Fn(mod 100007) 。

样例输入

3
5

样例输出

3
8

代码

#include<iostream>
using namespace std;

int main() {
	int cfx[50], i = 0;
	cfx[1] = 1, cfx[2] = 2;
	for (int j = 3; j <= 40; j++)
		cfx[j] = cfx[j - 1] + cfx[j - 2];
	int n[100];
	while (cin >> n[i]) {
		i++;
	}
	for (int j = 0; j < i; j++) {
		cout << cfx[n[j]] % 100007 << endl;
	}
	return 0;
}

题目 H: 求一个数列的最大项

题目描述

有如下的数列an,满足:

a1=1,a2i=ai+1;a2i+1=ai+ai+1;

求该数列的第n项及前n项中的最大值M。

输入

有多组数据,每组一行,其上有一个整数n(0<n<=100)。

输出

对输入的每个整数n,该数列的第n项及前n项中的最大值M。

样例输入

5
8

样例输出

5 5
4 6

代码

#include<iostream>
using namespace std;

int main() {
	int a[101];
	a[1] = 1;
	int n[100], j = 0;
	for (int i = 1; i <= 49; i++) {
		a[2 * i] = a[i] + 1;
		a[2 * i + 1] = a[i] + a[i + 1];
	}
	a[100] = a[50] + 1;
	while (cin >> n[j]) {
		j++;
	}
	
	for (int i = 0; i < j; i++) {
		int max = a[1];
		for (int k = 1; k <= n[i]; k++) {
			if (max < a[k])
				max = a[k];
		}
		cout << a[n[i]] << " " << max << endl;
	}
}

猜你喜欢

转载自blog.csdn.net/zwyxqzxx/article/details/127148118