声明
题解包含以下内容:
- (相对)高级的 C++ 模板及语法技巧
- 仅适用于 C++20 标准的代码
- 强烈的个人代码风格和 Modern C++ 范式追求
- 泛滥的标准库函数
换句话说就是(相较于其他公开题解)更低的查重率和更高的使用门槛;请酌情使用。
【id:369】【20分】A. 使用函数找出数组中的最大值 (指针)
题目描述
本题要求实现一个找出整型数组中最大值的函数,要求函数内访问数组元素使用指针,不要使用数组下标。
主函数参考如下:
#include <iostream>
using namespace std;
int FindArrayMax( int a[], int n );
int main()
{
const int MAXN=10;
int i, n;
int a[MAXN];
cin>>n;
for( i=0; i<n; i++ ){
cin>>a[i];
}
cout<<FindArrayMax(a, n)<<endl;
return 0;
}
/* 请在这里填写答案 */
输入
函数接口定义:
int FindArrayMax( int a[], int n );
其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。
输出
见样例
样例
输入样例1 | 输出样例1 |
---|---|
4 20 78 99 -14 | 99 |
Answer
#include <iostream>
#include <algorithm>
using namespace std;
int FindArrayMax(int *a, int n)
{
return *max_element(a, a + n);
}
int main()
{
uint64_t length {};
cin >> length;
int* arr = new int[length];
for (size_t i = 0ull; i < length; ++i)
cin >> *(arr + i);
cout << FindArrayMax(arr, length) << endl;
delete[] arr;
return 0;
}
【id:7】【20分】B. 三数论大小(指针)
题目描述
输入三个整数,然后按照从大到小的顺序输出数值。
要求:用三个指针分别指向这三个整数,排序过程必须通过这三个指针来操作,不能直接访问这三个整数
输出时,必须使用这三个指针,不能使用存储三个整数的变量
输入
第一行输入t表示有t个测试实例
第二行起,每行输入三个整数
输入t行
输出
每行按照从大到小的顺序输出每个实例
样例
输入样例1 | 输出样例1 |
---|---|
3 2 4 6 88 99 77 111 333 222 | 6 4 2 99 88 77 333 222 111 |
Answer
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
uint64_t t {};
cin >> t;
while (t--) {
int *arr = new int[3];
cin >> *arr >> *(arr + 1) >> *(arr + 2);
sort(arr, arr + 3, greater<int>());
cout << *arr << ' ' << *(arr + 1) << ' ' << *(arr + 2) << endl;
delete[] arr;
}
return 0;
}
【id:8】【20分】C. 货币兑换(指针与常量)
题目描述
设定以下汇率常量
美元汇率为6.2619,表示1美元兑换6.2619元人民币
欧元汇率为6.6744,表示1欧元兑换6.6744元人民币
日元汇率为0.0516,表示1元日元兑换0.0516元人民币
港币汇率为0.9200,表示1元港币币兑换0.92元人民币
定义一个常量指针,根据需求指针指向不同的汇率,然后计算出各种货币兑换为人民币的数量
要求:不能直接使用汇率常量进行计算,必须使用常量指针,只能使用一个指针
输入
输入一个t表示有t个测试实例
每行先输入一个字母,表示货币类型,然后再输入一个数字(正浮点数),表示货币数量
D表示美元,E表示欧元,Y表示日元,H表示港币
依次输入t行
输出
每行输出兑换后的人民币数量,保留4位小数
在C++中,输出指定精度的参考代码如下:
#include <iostream>
#include <iomanip> //必须包含这个头文件
using namespace std;
int main( )
{ double a =3.141596;
cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位
}
样例
输入样例1 | 输出样例1 |
---|---|
4 Y 10000 D 88.3 H 200 E 73.1 | 516.000 552.9258 184.0000 487.8986 |
Answer
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
constexpr double exchange_rate[] = {
6.2619, 6.6744, 0.0516, 0.9200
};
int main()
{
uint64_t t {};
cin >> t;
while (t--) {
char cash_tp {};
double cash_val {};
cin >> cash_tp >> cash_val;
switch (cash_tp) {
case 'D': {
cash_val *= *(exchange_rate + 0);
} break;
case 'E': {
cash_val *= *(exchange_rate + 1);
} break;
case 'Y': {
cash_val *= *(exchange_rate + 2);
} break;
case 'H': {
cash_val *= *(exchange_rate + 3);
} break;
default: {
} break;
}
cout << fixed << setprecision(4) << cash_val << endl;
}
return 0;
}
【id:15】【20分】D. 成绩查询(指针运算)
题目描述
已知一组学生成绩,然后根据输入的序号查询成绩
要求:
- 使用一个整数数组存储学生成绩
- 使用一个指针指向数组中间元素
- 求出数组中间元素的前一个成绩和后一个成绩
- 输入一个序号,然后计算这个序号的元素和中间元素的距离,然后使用指针去访问
例如有11个学生,指针指向中间的学生也就是第6个学生,若输入序号3,即查询第3个学生的成绩,第3和第6之间距离为3,那么指针应该怎么运算呢???
- 整个程序除了输入时可以使用数组下标,其他部分尽量使用使用指针进行访问。
输入
第一行输入t表示有t个测试实例
第二行先输入n,表示有n个学生,然后再输入n个成绩(正整数)
第三行输入1个序号,表示要查询成绩的学生的序号。
依次输入t个实例
按自然意义,序号是从1开始计算
提示:在数组中是从…
输出
对于每个测试实例:
第一行输出数组中间元素的前一个成绩和后一个成绩
第二行根据序号输出1个成绩
样例
输入样例1 | 输出样例1 |
---|---|
2 7 66 99 88 44 77 33 11 2 11 60 80 50 20 90 35 70 40 10 9 30 9 | 88 77 99 90 70 10 |
提示
当数组长度为偶数时,中间元素指的是靠后面的那一个元素
Answer
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
uint64_t t {};
cin >> t;
while (t--) {
size_t stu_num {};
cin >> stu_num;
int *score = new int[stu_num] {};
for (auto itr = score; itr != (score + stu_num); ++itr)
cin >> *itr;
cout << *(score + (stu_num / 2) - 1) << ' ' << *(score + (stu_num / 2) + 1) << endl;
size_t select {}; cin >> select;
cout << score[select - 1] << endl;
delete[] score;
}
return 0;
}
【id:9】【20分】E. 动态数组(指针与数组)
题目描述
一开始未知数组长度,根据要求创建不同类型的指针,并且使用指针创建相应长度的数组,然后再完成不同的要求
若要求创建整数数组,计算数组内所有数据的平均值
若要求创建字符数组,找出数组内的最大字母
若要求创建浮点数数组,找出数组的最小值
要求程序整个过程不能使用数组下标,从数组创建、输入到搜索、比较、计算,到输出都必须使用指针
提示:使用new关键字
输入
第一行输入t表示有t个测试实例
第二行先输入一个大写字母表示数组类型,I表示整数类型,C表示字符类型,F表示浮点数类型;然后输入n表示数组长度。
第三行输入n个数据
依次输入t个实例
输出
每个根据不同的数组类型输出相应的结果
样例
输入样例1 | 输出样例1 |
---|---|
3 C 5 A D E B C I 6 22 55 77 33 88 55 F 4 3.1 1.9 6.5 4.8 | E 55 1.9 |
Answer
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
template<typename T>
T* get_input(size_t scale)
{
T* ret = new T[scale] {};
for (auto itr = ret; itr != (ret + scale); ++itr)
cin >> *itr;
return ret;
}
int main()
{
uint64_t t {};
cin >> t;
while (t--) {
char selection {};
size_t length {};
cin >> selection >> length;
switch (selection) {
case 'I': {
auto arr = get_input<int>(length);
cout << accumulate(arr, arr + length, 0) / length << endl;
delete[] arr;
} break;
case 'C': {
auto arr = get_input<char>(length);
cout << *max_element(arr, arr + length) << endl;
delete[] arr;
} break;
case 'F': {
auto arr = get_input<double>(length);
cout << *min_element(arr, arr + length) << endl;
delete[] arr;
} break;
default: break;
}
}
return 0;
}