【23级红细胞招新模拟训练(部分题解 不包含最后三题】

前言

提前说明 : 本人是蒟蒻 题解基本没考虑过优化 只求通过
写这篇题解仅仅是分享一下我的做法
使用的语言:cpp

6-1

题目

请编写函数,对三个整数按升序排序。

函数原型 void IntSortAsc3(int *x, int *y, int *z); 

说明:参数 x、y 和 z
为指示三个整型变量的指针,函数值对这三个整型变量进行排序,使 x、y 和 z 所指变量的值按由小到大的顺序排列。

裁判程序
#include 

void IntSwap(int *x, int *y); void IntSortAsc3(int *x, int *y, int
*z);

int main() {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    IntSortAsc3(&a, &b, &c);
    printf("%d %d %d\n", a, b, c);
    return 0; }

void IntSwap(int *x, int *y) {
    ...()... }

/* 你提交的代码将被嵌在这里 */

输入样例
15 -27 36

输出样例
-27 15 36

要求:调用前面作业中的 IntSwap 函数交换两个整数的值。

知识点

基础语法:指针的使用
使用语言:C语言

参考代码

void IntSortAsc3(int* x, int* y, int* z) 
{
	if (*x > *y)
	{
		IntSwap(x, y);
	}
	if (*y > *z)
	{
		IntSwap(y, z);
	}
	if (*x > *y)
	{
		IntSwap(x, y);
	}
}

代码解析

通过三个if语句判断一下大小关系

通过画图我们可以理解
前两个if语句已经比较了(x, y)(y, z)这两组
最后直接比较x和y即可

下面给出一个例子
【23级红细胞招新模拟训练(部分题解 不包含最后三题】_第1张图片

个人做题过程

一开始第三个if语句我写的是

if (*x > *z)

发现不对 画个图就理解了

以及 完全没看到题目中的要求 写半天发现没分

7-1【23级红细胞招新模拟训练(部分题解 不包含最后三题】_第2张图片

不想写了 直接上代码

#include

using namespace std;

int main()
{
	cout << "                ********" << endl;
	cout << "               ************" << endl;
	cout << "               ####....#." << endl;
	cout << "             #..###.....##...." << endl;
	cout << "             ###.......######              ###            ###" << endl;
	cout << "                ...........               #...#          #...#" << endl;
	cout << "               ##*#######                 #.#.#          #.#.#" << endl;
	cout << "            ####*******######             #.#.#          #.#.#" << endl;
	cout << "           ...#***.****.*###....          #...#          #...#" << endl;
	cout << "           ....**********##.....           ###            ###" << endl;
	cout << "           ....****    *****...." << endl;
	cout << "             ####        ####" << endl;
	cout << "           ######        ######";

	return 0;
}

7-2

题目

请输出一个三角形,每行由字符串“tnzenb”循环组成

输入格式:
一个整数N

输出格式:
N行字符,即一个三角形,注意不要输出多余的空格和换行。

输入样例:
在这里给出一组输入。 例如:

3
输出样例:
在这里给出相应的输出。例如:

t tnz tnzen

知识点

字符串 + 循环

参考代码


#include

using namespace std;

int main()
{
	int n;
	cin >> n;
	string arr = "tnzenb";
	for (int i = 1; i <= n; i++)
		//行数
	{
		for (int j = 1; j <= n - i; j++)
			//打印空格
		{
			cout << " ";
		}

		for (int k = 0; k < 2 * i - 1; k++)
		{
			cout << arr[k % 6];
		}
		cout << endl;
	}

	return 0;
}

代码解析

这题打印出金字塔型很容易也就是打印出字母前面的空格 通过i和j之间的关系就可以做到

每行字母的个数是等差数列

需要注意的是字母的循环打印
我们注意到:字符串的内容是固定的 且每行都是从t(即第一个字符)开始打印
那么, 我们就可以通过对k的判断 直接输出字母

个人做题过程

复盘的时候 我看自己的代码怎么看怎么觉得不对劲

下面也让大家难受一下

			if (k % 6 != 0)
			{
				cout << arr[k % 6];
			}
			else
			{
				cout << "t";
			}

7-3

知识点

循环 + 判断语句

参考代码

 #include

using namespace std;

int main()
{
	int t, num = 0;
	cin >> t;
	for (int i = 0; i < t; i++)
	{
		int m;
		cin >> m;
		num = 0;
		for (int x = 0; x < m; x++)
		{
			int a, b;
			cin >> a >> b;
			if (a > b)
			{
				num += 3;
			}
			else
			{
				num += 1;
			}
		}
		cout << num << endl;
	}
	return 0;
}

代码解析

因为两人的成绩作比较只可能有两种情况
所以 通过if else语句可做出这道题

个人做题过程

没卡 所以没得写

7-4

题目

知识点

循环 + 判断语句 + 控制输出

setw fixed 和setprecision语句

同学们或多或少的接触过fixed和setprecision语句
fixed语句是按照小数的形式输出变量
setprecision语句是用于控制输出的位数(精度)
setw语句用于控制输出的长度(宽度)

下面给出两个例子

#include   
#include   
  
int main() {  
    double pi = 3.141592653589793;  
    std::cout << std::setprecision(3) << pi << std::endl;  // 输出 3.142  
    return 0;  
}
#include   
#include   
  
int main() {  
    int x = 123;  
    std::cout << std::setw(10) << x << std::endl;  
    return 0;  
}

//使用setw语句 也就是我们常说的右对齐

参考代码

#include 
#include  

using namespace std;

int main() {
	int a, b;
	cin >> a >> b;

	int sum = 0;
	int cnt = 0;

	for (int num = a; num <= b; num++) 
	{
		cout << setw(5) << num; 
		sum += num;
		cnt++;

		if (cnt % 5 == 0) 
		{
			cout << endl;
		}
	}

	if (cnt % 5 != 0) 
	{
		cout << endl;
	}

	cout << "Sum = " << sum << endl;

	return 0;
}

代码解析

个人做题过程

我一开始用空格做题 发现判断起来比较麻烦
就用了setw语句
(还挺好用的

7-5

知识点

循环语句

参考代码

 #include

using namespace std;

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i < n; i++)
	{
		for (int j = 1; j < n; j++)
		{
			for (int k = 1; k <= n; k++)
			{
				if (i * i + j * j == k * k)
				{
					cout << "(" << i << ", " << j << ", " << k << ")" << endl;
				}
			}
		}
	}

	return 0;
}

代码解析

这道题根据题目提示 并且通过测试用例可以看出是升序输出
所以 直接用三个for循环遍历一下就行了

个人做题过程

我一开始比较叛逆 不想按照题目提示来做 然后没想出来其他的方法
就莽了一下

7-6

知识点

结构体 + 循环语句 + 输出语句 + 判断语句

参考代码

#include 
#include 

using namespace std;

struct CAT 
{
    string name;
    double lw, hw, cw, ck;
    //分别对应着 最低体重 最高体重 
    //         推荐体重 推荐摄入的卡路里
} cat[9010];

int main() 
{
    int n, k;
    cin >> n >> k;
    string nname;
    double w;

    for (int i = 0; i < k; i++)
    {
        cin >> cat[i].name >> cat[i].lw >> cat[i].hw >> cat[i].cw;
        cat[i].ck = cat[i].cw * 13.6 + 70;
    }

    cout << fixed << setprecision(1);

    for (int i = 0; i < n; i++) 
    {
        cin >> nname >> w;

        for (int j = 0; j < k; j++) 
        {
            if (cat[j].name == nname) 
            {

                if (w > cat[j].hw) 
                {
                    cout << "overweight " << cat[j].ck << endl;
                } 
                else if (w < cat[j].lw) 
                {
                    cout << "underweight " << cat[j].ck << endl;
                } 
                else 
                {
                    cout << "OK " << cat[j].ck << endl;
                }

                break;
            }
        }

    }

    return 0;
}

代码解析

创建结构体数组存储每种类型的猫

一只一只的输入 边输入边判断 然后遍历结构体数组 找到对应的品种

然后用if else语句判断一下就行了 判断完跳出循环

个人做题过程

这题 也还好吧 没啥卡人的地方 一步一步做就行了

7-7

知识点

数组 + 数学 + 循环

参考代码

#include 
#include  

using namespace std;

int main() {
    int n;
    cin >> n;

    int arr[100][100]; // 定义一个二维数组用于存储结果

    int num = 1; // 初始化数字
    int a = 0; // 行的起始位置
    int b = 0; // 列的起始位置
    int a1 = n - 1; // 行的结束位置
    int b1 = n - 1; // 列的结束位置

    while (num <= n * n) 
    {
        // 从左到右填充数字
        for (int i = b; i <= b1; i++) 
        {
            arr[a][i] = num++;
        }
        a++;

        // 从上到下填充数字
        for (int i = a; i <= a1; i++) 
        {
            arr[i][b1] = num++;
        }
        b1--;

        // 从右到左填充数字
        for (int i = b1; i >= b; i--) 
        {
            arr[a1][i] = num++;
        }
        a1--;

        // 从下到上填充数字
        for (int i = a1; i >= a; i--) 
        {
            arr[i][b] = num++;
        }
        b++;
    }

    // 输出结果
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < n; j++) 
        {
            cout << setw(3) << arr[i][j]; // 使用 setw() 函数设置输出宽度为 3
        }
        cout << endl;
    }

    return 0;
}

代码解析

我们通过分析测试用例很容易发现这道题的数字排列方式类似一个回型
就可以通过四个边界值 (a 、 b 、a1、 b1)来分别控制每行和每列的输入
这样就不用考虑数字(即num)之间的关系 直接让他一直自增即可

可以看给出的注释
打印完第一行 打印最后一列
打印最后一行 打印第一列
然后这个范围逐渐缩小 直到num达到n * n
赋值完成

个人做题过程

这题很有意思啊 又是我最喜欢(头痛)的数学问题
刚开始看到的时候 我想找一下数学规律 想了几分钟 找不出来 就摁做 一圈一圈的赋值 最后再一行一行的输出
(不喜欢找规律的题

个人感想(前八道题)

不难啊 我只能说 前八道都是通过莽(跟着题目一步一步走)就能做出来的 并且花费的时间也不会很长

至于最后三道题 没做 不做评价(呜呜呜呜呜呜 我是蒟蒻

当然 有其他的思路或者做法大家可以发在评论区或者写一篇博客 多多交流 一起进步

你可能感兴趣的:(C++题目集,算法)