2452 字
12 分钟
GESP 2024年C++一级编程题解析
2024/03/16
2024/12/07

202412-1 温度转换#

题目描述

小杨最近学习了开尔文温度、摄氏温度和华氏温度的转换。令符号 $K$ 表开尔文温度,符号 CC 表摄氏温度,符号 FF 表华氏温度,这三者的转换公式如下:

C=K273.15F=C×1.8+32\begin{aligned} C=K-273.15 \\ F=C\times 1.8+32 \end{aligned}

现在小杨想编写一个程序计算某一开尔文温度对应的摄氏温度和华氏温度,你能帮帮他吗?

输入描述

一行,一个实数 KK,表示开尔文温度。

输出描述

一行,若输入开尔文温度对应的华氏温度高于 212212,输出 Temperature is too high!

否则,输出用空格分隔的两个实数 CCFF,分别表示摄氏温度和华氏度,保留两位小数。

样例输入 1

412.00

样例输出 1

Temperature is too high!

样例输入 2

173.56

样例输出 2

-99.59 -147.26

代码解析

重点考察分支结构,这道题易错点是题目要求判断华氏温度高于 212212,先算出 c 和 f 再进行判断即可。

#include<bits/stdc++.h>
using namespace std;
int main() {
double k, c, f;
cin >> k;
c = k - 273.15;
f = c * 1.8 + 32;
if (f > 212) {
cout << "Temperature is too high!";
} else {
cout << fixed << setprecision(2) << c << ' ' << f;
}
return 0;
}

202412-2 奇数和偶数#

题目描述

小杨有 nn 个正整数,他想知道其中的奇数有多少个,偶数有多少个。

输入描述

第一行包含一个正整数 nn,代表正整数个数。

之后 nn 行,每行包含一个正整数。

输出描述

输出两个正整数(英文空格间隔),代表奇数的个数和偶数的个数。如奇数或偶数的个数为 00,则对应输出 00

样例输入 1

5
1
2
3
4
5

样例输出 1

3 2

提示

对于全部数据,保证有 1n1051\leq n\leq 10^5 且正整数不超过 10510^5

代码解析

这道题考察 for 循环的基本用法,以及使用 for 循环和 if 嵌套进行数据统计,简单。

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, cnt0 = 0, cnt1 = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
if (a % 2 == 0) cnt0++;
else cnt1++;
}
cout << cnt1 << ' ' << cnt0;
return 0;
}

202409-1 小杨购物#

题目描述

小杨有 nn 元钱用于购物。商品 A 的单价是 aa 元,商品 B 的单价是 bb 元。小杨想购买相同数量的商品 A 和商品 B。

请你编写程序帮助小杨计算出他最多能够购买多少个商品 A 和商品 B。

输入格式

第一行包含一个正整数 nn,代表小杨用于购物的金额。

第二行包含一个正整数 aa,代表商品 A 的单价。

第三行包含一个正整数 bb,代表商品 B 的单价。

输出格式

输出一行,包含一个整数,代表小杨最多能够购买的商品 A 和商品 B 的数量。

样例输入 1

12
1
2

样例输出 1

4

样例输入 2

13
1
2

样例输出 2

4

提示

【样例 1 解释】

对于样例 1,由于需要购买相同数量的两种商品,因此小杨最多能够购买 44 件商品 AA44 件商品 BB,共花费 1×4+2×4=121 \times 4 + 2 \times 4 = 12 元。因此,样例 1 的答案为 44

【样例 2 解释】

对于样例 1,由于需要购买相同数量的两种商品,因此小杨最多能够购买 44 件商品 AA44 件商品 BB,共花费 1×4+2×4=121 \times 4 + 2 \times 4 = 12 元。因此,样例 1 的答案为 44。如果小杨想购买 55 件商品 AA 和商品 BB,则需要花费 1×5+2×5=151 \times 5 + 2 \times 5 = 15 元,超过了小样的预算 1313 元。因此,样例 2 答案为 44

【数据规模与约定】

对全部的测试数据,保证 1n,a,b1051 \leq n,a,b \leq 10^5

代码解析

枚举法,从 num = 0 开始,逐个判断总花费和预算 n 之间的关系,如果总花费 a * num + b * num 大于预算,说明当前的 num 已经不符合条件,num-1 就是最后一次满足条件的取值

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, a, b, num = 0;
cin >> n >> a >> b;
while(n >= a*num + b*num)
num++;
cout << num - 1;
return 0;
}

202409-2 美丽数字#

题目描述

小杨有 nn 个正整数,他认为一个正整数是美丽数字当且仅当该正整数是 99 的倍数但不是 88 的倍数。

小杨想请你编写一个程序计算 nn 个正整数中美丽数字的数量。

输入格式

第一行包含一个整数 nn,代表正整数个数。 第二行有 nn 个正整数 a1,a2,ana_1, a_2, \dots a_n

输出格式

输出一个整数,表示其中美丽数字的数量。

样例输入 1

3
1 9 72

样例输出 1

1

提示

【样例 1 解释】

  • 11 既不是 99 的倍数也不是 88 的倍数。
  • 9999 的倍数不是 88 的倍数。
  • 7272 既是 99 的倍数又是 88 的倍数。

【数据规模与约定】

对全部的测试数据,保证 1n,ai1051 \leq n, a_i \leq 10^5

代码解析

for 循环中每次循环都输入一个值,判断这个值是否符合条件,使用 cnt 进行筛选计数,最基础的计数题。

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
if (a % 9 == 0 && a % 8 != 0)
cnt++;
}
cout << cnt;
return 0;
}

202406-1 休息时间#

题目描述

小杨计划在某个时刻开始学习,并决定在学习 kk 秒后开始休息。

小杨想知道自己开始休息的时刻是多少。

输入格式

前三行每行包含一个整数,分别表示小杨开始学习时刻的时 hh、分 mm、秒 ssh,m,sh,m, s 的值符合 1<h12,0m59,0s591 < h \le 12,0 \le m\le 59,0 \le s\le59)。

第四行包含一个整数 kk,表示小杨学习的总秒数(注:kk 的值符合 1k36001 \le k \le 3600)。

输出格式

输出一行,包含三个整数,分别表示小杨开始休息时刻的时、分、秒。

样例输入 1

12
59
59
10

样例输出 1

13 0 9

提示

小杨在时刻 12:59:59 开始学习,学习 10 秒后开始休息,即在 13:0:9 时刻开始休息。

对于全部数据,保证有 1<h121 < h \le 120m590 \le m\le 590s590 \le s\le 591k36001 \le k \le 3600

代码解析

简单的数学计算,先将秒数 s 增加 t,然后逐步处理进位

注:也可以使用循环模拟,一秒一秒去加,但是会导致代码更复杂

#include<bits/stdc++.h>
using namespace std;
int main() {
int h, m, s, t;
cin >> h >> m >> s >> t;
s += t;
m += s/60;
s %= 60;
h += m/60;
m %= 60;
cout << h << ' ' << m << ' ' << s;
return 0;
}

202406-2 立方数#

题目描述

小杨有一个正整数 nn,他想知道 nn 是否是一个立方数。一个正整数 nn 是立方数当且仅当存在一个正整数 xx 满足 x×x×x=nx\times x\times x=n

输入格式

第一行包含一个正整数 nn

输出格式

如果正整数 nn 是一个立方数,输出 Yes,否则输出 No

样例输入 1

8

样例输出 1

Yes

样例输入 2

9

样例输出 2

No

提示

对于样例 1,存在正整数 22 使得 8=2×2×28=2\times 2\times 2 ,因此 88 为立方数。

对于样例 22,不存在满足条件的正整数,因此 99 不为立方数。

对于全部数据,保证有 1n10001 \le n \le 1000

代码解析

枚举法,类似于判断质数的代码,设置一个标记变量 flag,初始化为 false,如果枚举过程中 i*i*i == a 一次都没有成立,flag 依旧为 flase,说明不存在,否则存在

#include<bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
bool flag = false;
for (int i = 1; i <= a; i++) {
if (i*i*i == a)
flag = true;
}
if (flag) cout << "Yes";
else cout << "No";
return 0;
}

202403-1 小杨买书#

题目描述

小杨同学积攒了一部分零用钱想要用来购买书籍,已知一本书的单价是 1313 元,请根据小杨零用钱的金额,编写程序计算可以购买多少本书,还剩多少零用钱。

输入格式

输入一个正整数 mm,表示小杨拥有的零用钱数。

输出格式

输出包含两行,第一行,购买图书的本数;第二行,剩余的零用钱数。

样例输入 1

100

样例输出 1

7
9

样例输入 2

199

样例输出 2

15
4

提示

【数据规模与约定】

对全部的测试数据,保证 0<m<2000 < m < 200

代码解析

商是能够买的本数,余数是剩余的零钱

#include<bits/stdc++.h>
using namespace std;
int main() {
int m;
cin >> m;
cout << m / 13 << endl << m % 13;
return 0;
}

202403-2 找因数#

题目描述

小 A 最近刚刚学习了因数的概念,具体来说,如果一个正整数 aa 可以被另一个正整数 bb 整除,那么我们就说 bbaa 的因数。

请你帮忙写一个程序,从小到大输出正整数 aa 的所有因数。

输入格式

输入一行一个正整数 aa。保证 a1000a\leq1000

输出格式

输出若干行,为 aa 的所有约数,从小到大排序。

样例输入 1

1

样例输出 1

1

样例输入 2

6

样例输出 2

1
2
3
6

样例输入 3

10

样例输出 3

1
2
5
10

代码解析

for 循环筛选,打印 1 ~ a 中能被 a 整除的 i

#include<bits/stdc++.h>
using namespace std;
int main() {
int a;
cin >> a;
for (int i = 1; i <= a; i++)
if (a % i == 0)
cout << i << endl;
return 0;
}
GESP 2024年C++一级编程题解析
https://yezi.press/posts/gesp/gesp-cpp1-2024/
作者
Yezi 叶子
发布于
2024/03/16
许可协议
CC BY-NC-SA 4.0