2247 字
11 分钟
GESP 2023年C++一级编程题解析

202312-1 小杨的考试#

题目描述

今天是星期 XX,小杨还有 NN 天就要考试了,你能推算出小杨考试那天是星期几吗?(本题中使用 77 表示星期日)

输入格式

输入 22 行,第一行一个整数 X(1X7)X(1\le X \le 7);第二行一个整数 N(1N364)N(1≤N≤364)

输出格式

输出一个整数,表示小杨考试那天是星期几。

样例输入 1

1
6

样例输出 1

7

样例输入 2

5
3

样例输出 2

1

提示

【样例解释 1】

今天是星期 1,那么 6 天后就是星期日,星期日在本题中用 77 表示。

【样例解释 2】

今天是星期 5,那么 3 天后就是星期 1。

代码解析

今天是星期 X,明天就是星期 X+1,一天一天的加就好啦,加 N 次,如果加到了星期 8 就让他重新变成 1

#include<bits/stdc++.h>
using namespace std;
int main() {
int X, N;
cin >> X >> N;
for (int i = 0; i < N; i++) {
X++;
if (X == 8)
X = 1;
}
cout << X;
return 0;
}

202312-2 小杨报数#

题目描述

小杨需要从 11NN 报数。在报数过程中,小杨希望跳过 MM 的倍数。例如,如果 N=5N=5M=2M=2 ,那么小杨就需要依次报出 113355

现在,请你依次输出小杨报的数。

输入格式

输入 22 行,第一行一个整数 N(1N1,000)N(1 \le N \le 1,000);第二行一个整数 M(2M100)M(2 \le M \le 100)

输出格式

输出若干行,依次表示小杨报的数。

样例输入 1

5
2

样例输出 1

1
3
5

样例输入 2

10
3

样例输出 2

1
2
4
5
7
8
10

代码解析

报数的时候判断 i 不是 m 的倍数则输出

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

202309-1 买文具#

题目描述

开学了,小明来到文具店选购文具。签字笔 22 元一支,他需要 XX 支;记事本 55 元一本,他需要 YY 本;直尺 33 元一把,他需要 ZZ 把。小明手里有 QQ 元钱。请你通过编程帮小明算算,他手里的钱是否够买他需要的文具。

输入格式

第一行包含一个正整数,是小明购买签字笔的数量。约定 1X101 \le X \le 10

第二行包含一个正整数,是小明购买记事本的数量。约定 1Y101 \le Y \le 10

第三行包含一个正整数,是小明购买直尺的数量。约定 1Z101 \le Z \le 10

第四行包含一个正整数 QQ,是小明手里的钱数(单位:元)。

输出格式

输出 22 行。如果小明手里的钱够买他需要的文具,则第一行输出 Yes,第二行输出小明会剩下的钱数(单位:元);否则,第一行输出 No,第二行输出小明缺少的钱数(单位:元)。

样例输入 1

1
1
1
20

样例输出 1

Yes
10

样例输入 2

1
1
1
5

样例输出 2

No
5

代码解析

每个文具购买的数量乘以对应价钱得到 price ,再比较手里的 p 和需要的钱 price

#include<bits/stdc++.h>
using namespace std;
int main() {
int x, y, z, q;
cin >> x >> y >> z >> q;
int price = x*2 + y*5 + z*3;
if (price > q ){
cout << "No" << endl;
cout << price - q;
} else {
cout << "Yes" << endl;
cout << q - price;
}
return 0;
}

202309-2 小明的幸运数#

题目描述

所有个位数为 kk 的正整数,以及所有 kk 的倍数,都被小明称为“ kk 幸运数”。小明想知道正整数 LLRR 之间(包括 LLRR)所有 kk 幸运数的和,你能帮帮他吗?

输入格式

输入 33 行。第一行包含一个正整数 kk,第二行包含一个正整数 LL,第三行包含一个正整数 RR。约定 2k92 \le k \le 91LR10001 \le L \le R \le 1000

输出格式

输出 11 行,符合题意的幸运数之和。

样例输入 1

7
1
10

样例输出 1

7

样例输入 2

7
10
20

样例输出 2

31

提示

【样例解释 1】

111010 之间共有 1177 幸运数:77。因为 77 既是 77 的倍数,个位数又为 77。因此,结果为 77

【样例解释 2】

10102020 之间共有 2277 幸运数:14141717141477 的倍数,1717 的个位数为 77。因此,结果为 3131

代码解析

判断个位数为 k :i % 10 == k 判断 k 的倍数:i % k == 0

#include<bits/stdc++.h>
using namespace std;
int main() {
int L, R, k, cnt = 0;
cin >> k >> L >> R;
for (int i = L; i <= R; i++) {
if (i % k == 0 || i % 10 == k)
cnt += i;
}
cout << cnt;
return 0;
}

202306-1 时间规划#

题目描述

小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟,你能通过编程帮他做到吗?

输入格式

输入 44 行,第一行为开始时刻的小时,第二行为开始时刻的分钟,第三行为结束时刻的小时,第四行为结束时刻的分钟。输入保证两个时刻是同一天,开始时刻一定在结束时刻之前。时刻使用 2424 小时制,即小时在 002323 之间,分钟在 005959 之间。

输出格式

输出一行,包含一个整数,从开始时刻到结束时刻之间有多少分钟。

样例输入 1

9
5
9
6

样例输出 1

1

样例输入 2

9
5
10
0

样例输出 2

55

代码解析

看下面两个例子理解分钟的计算方法:

2:30 ~ 4:40 相差 (4-2)*60+(40-30) = 130 分钟 2:40 ~ 4:30 相差 (4-2)*60+(30-40) = 110 分钟

#include<bits/stdc++.h>
using namespace std;
int main() {
int a1,b1,a2,b2;
cin >> a1 >> b1 >> a2 >> b2;
cout << (a2-a1)*60+(b2-b1);
return 0;
}

202306-2 累计相加#

题目描述

输入一个正整数 nn,求形如:

1+(1+2)+(1+2+3)+(1+2+3+4)++(1+2+3+4+5++n)1+(1+2)+(1+2+3)+(1+2+3+4)+ \cdots +(1+2+3+4+5+ \cdots +n) 的累计相加。

输入格式

输入一个正整数 nn。约定 1<n1001<n \le 100

输出格式

输出累计相加的结果。

样例输入 1

3

样例输出 1

10

样例输入 2

4

样例输出 2

20

样例输入 3

10

样例输出 3

220

代码解析

这里的内层循环变量 j 每次都会从 1 开始重新进行一整轮,只需要用 i 控制内层循环次数即可。

#include<bits/stdc++.h>
using namespace std;
int main() {
int n, s = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
s += j;
}
}
cout << s;
return 0;
}

202303-1 每月天数#

题目描述

小明刚刚学习了每月有多少天,以及如何判断平年和闰年,想到可以使用编程方法求出给定的月份有多少天。你能做到吗?

输入格式

输入一行,包含两个整数 A,BA, B,分别表示一个日期的年、月。约定 2000A30002000 \leq A \leq 30001B121 \leq B \leq 12

输出格式

输出一行,包含一个整数,表示输入月份有多少天。

样例输入 1

2022 1

样例输出 1

31

样例输入 2

2020 2

样例输出 2

29

代码解析

使用数组 a[] 表示每月的天数,如 a[1] 代表 1 月的天数

#include<bits/stdc++.h>
using namespace std;
int main() {
int a[] = {0, 31,28,31,30,31,30,31,31,30,31,30,31};
int y, m;
cin >> y >> m;
if (y%4==0 && y%100!=0 || y%400==0)
a[2] = 29;
cout << a[m];
return 0;
}

202303-2 长方形面积#

题目描述

小明刚刚学习了如何计算长方形面积。他发现,如果一个长方形的长和宽都是整数,它的面积一定也是整数。现在,小明想知道如果给定长方形的面积,有多少种可能的长方形,满足长和宽都是整数?如果两个长方形的长相等、宽也相等,则认为是同一种长方形。约定长方形的长大于等于宽。正方形是长方形的特例,即长方形的长和宽可以相等。

输入格式

输入一行,包含一个整数 AA,表示长方形的面积。约定 2A10002 \leq A \leq 1000

输出格式

输出一行,包含一个整数 CC,表示有 CC 种可能的长方形。

样例输入 1

4

样例输出 1

2

样例输入 2

6

样例输出 2

2

提示

【样例 1 解释】

22 种长方形面积为 44,它们的长宽分别为 2×22 \times 24×14 \times 1

【样例 2 解释】

22 种长方形面积为 66,它们的长宽分别为 3×23 \times 26×16 \times 1

代码解析

这道题实际上就是求一个数的因数有多少 “对”(如 6 的因数有 1,6 和 2,3,一共两对) 1 ~ sqrt(s) 中 s 的因数个数就是所求的值(如 16 的算数平方根为 4,1~4 中 16 的因数有 1、2、4,那 16 的因数也就是有 3 对:(1, 16)、(2, 8)、(4, 4)。)

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