文章目录
- 一、前言
- 二、问题
- 问题:[GESP202403 一级] 小杨买书
- 问题:[GESP202403 一级] 找因数
- 问题: [GESP202406 一级] 休息时间
- 问题:[GESP202406 一级] 立方数
- 问题:[GESP202409 一级] 小杨购物
- 问题:[GESP202409 一级] 美丽数字
- 问题:[GESP202412 一级] 温度转换
- 问题:[GESP202412 一级] 奇数和偶数
- 三、感谢
一、前言
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
本章节主要对GESP 2024 C++一级的问题进行讲解,包括《[GESP202403 一级] 小杨买书》《[GESP202403 一级] 找因数》《[GESP202406 一级] 休息时间》《[GESP202406 一级] 立方数》《[GESP202409 一级] 小杨购物》《[GESP202409 一级] 美丽数字》《[GESP202412 一级] 温度转换》《[GESP202412 一级] 奇数和偶数》题目。
二、问题
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202403 一级] 小杨买书
类型:基本运算
题目描述:
小杨同学积攒了一部分零用钱想要用来购买书籍,已知一本书的单价是 13 13 13 元,请根据小杨零用钱的金额,编写程序计算可以购买多少本书,还剩多少零用钱。
输入:
输入一个正整数 m m m,表示小杨拥有的零用钱数。
输出:
输出包含两行,第一行,购买图书的本数;第二行,剩余的零用钱数。
样例1:
输入:
100
输出:
7
9
样例2:
输入:
199
输出:
15
4
提示:
对全部的测试数据,保证 0 < m < 200 0 < m < 200 0<m<200。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一本书的单价是 13 元
//未知:计算可以购买多少本书,还剩多少零用钱。
//关系:通过总金额除以单价得到能买多少本书(整数部分),通过取模运算得到剩余的钱。
//二、数据定义
int n; // 定义一个整型变量n,用来存储用户输入的总金额。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示用户拥有的总金额。
//四、数据计算
// 这里省略了显式的计算步骤,直接在输出时进行计算。
// 使用整数除法计算可以购买的书的数量:n / 13。
// 使用取模运算计算剩余的钱:n % 13。
//五、输出结果
cout << n / 13 << endl << n % 13; // 输出两行:
// 第一行是能买的书的数量(总金额除以单价的结果),
// 第二行是剩余的钱(总金额对单价取模的结果)。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202403 一级] 找因数
类型:简单循环
题目描述:
小 A 最近刚刚学习了因数的概念,具体来说,如果一个正整数 a a a 可以被另一个正整数 b b b 整除,那么我们就说 b b b 是 a a a 的因数。
请你帮忙写一个程序,从小到大输出正整数 a a a 的所有因数。
输入:
输入一行一个正整数 a a a。保证 a ≤ 1000 a\leq1000 a≤1000。
输出:
输出若干行,为 a a a 的所有约数,从小到大排序。
样例1:
输入:
1
输出:
1
样例2:
输入:
6
输出:
1
2
3
6
样例3:
输入:
10
输出:
1
2
5
10
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个正整数 a
//未知:从小到大输出正整数 a 的所有因数
//关系:如果一个数 i 能够整除 a (即 a % i == 0),那么 i 就是 a 的一个因数。
//二、数据定义
int a; // 定义一个整型变量a,用来存储用户输入的正整数。
//三、数据输入
cin >> a; // 从标准输入读取一个整数a,表示要找因数的正整数。
//四、数据计算
for(int i = 1; i <= a; ++i){ // 开始一个循环,从1遍历到a(包括a)。
if(a % i == 0){ // 如果a能够被当前的i整除(没有余数),则i是a的一个因数。
cout << i << endl; // 输出因数i,并换行以便下一个因数在新的一行输出。
}
}
//五、输出结果
// 输出已经在上面的循环中完成,因此这里不需要额外的输出语句。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题: [GESP202406 一级] 休息时间
类型:基本运算
题目描述:
小杨计划在某个时刻开始学习,并决定在学习 k k k 秒后开始休息。
小杨想知道自己开始休息的时刻是多少。
输入:
前三行每行包含一个整数,分别表示小杨开始学习时刻的时
h
h
h、分
m
m
m、秒
s
s
s(
h
,
m
,
s
h,m, s
h,m,s 的值符合
1
<
h
≤
12
,
0
≤
m
≤
59
,
0
≤
s
≤
59
1 < h \le 12,0 \le m\le 59,0 \le s\le59
1<h≤12,0≤m≤59,0≤s≤59)。
第四行包含一个整数 k k k,表示小杨学习的总秒数(注: k k k 的值符合 1 ≤ k ≤ 3600 1 \le k \le 3600 1≤k≤3600)。
输出:
输出一行,包含三个整数,分别表示小杨开始休息时刻的时、分、秒。
样例:
输入:
12
59
59
10
输出:
13 0 9
提示:
小杨在时刻 12:59:59 开始学习,学习 10 秒后开始休息,即在 13:0:9 时刻开始休息。
对于全部数据,保证有 1 < h ≤ 12 1 < h \le 12 1<h≤12, 0 ≤ m ≤ 59 0 \le m\le 59 0≤m≤59, 0 ≤ s ≤ 59 0 \le s\le 59 0≤s≤59, 1 ≤ k ≤ 3600 1 \le k \le 3600 1≤k≤3600。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:某个时刻开始学习,学习 k 秒后开始休息。
//未知:开始休息的时刻是多少。
//关系:需要将起始时间和学习时间相加,然后转换回小时、分钟和秒的形式。
//二、数据定义
int h, m, s, k; // 定义四个整型变量:
// h - 存储用户输入的起始时刻的小时数;
// m - 存储用户输入的起始时刻的分钟数;
// s - 存储用户输入的起始时刻的秒数;
// k - 存储用户输入的学习的持续时间(秒)。
//三、数据输入
cin >> h >> m >> s >> k; // 从标准输入读取四个整数,分别表示起始时刻的小时、分钟、秒以及学习的持续时间。
//四、数据计算
// 将起始时间转换成总的秒数,并加上学习的持续时间k。
int t = h * 3600 + m * 60 + s + k;
// 然后将总秒数t重新转换回小时、分钟和秒。
h = t / 3600; // 计算总小时数。
m = (t % 3600) / 60; // 计算剩余的分钟数。
s = t % 60; // 计算剩余的秒数。
//五、输出结果
cout << h << " " << m << " " << s; // 输出休息开始的具体时刻,格式为小时 分钟 秒。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202406 一级] 立方数
类型:简单循环
题目描述:
小杨有一个正整数 n n n,他想知道 n n n 是否是一个立方数。一个正整数 n n n 是立方数当且仅当存在一个正整数 x x x 满足 x × x × x = n x\times x\times x=n x×x×x=n 。
输入:
第一行包含一个正整数 n n n。
输出:
如果正整数
n
n
n 是一个立方数,输出 Yes
,否则输出 No
。
样例1:
输入:
8
输出:
Yes
样例2:
输入:
9
输出:
No
提示:
对于样例 1,存在正整数 2 2 2 使得 8 = 2 × 2 × 2 8=2\times 2\times 2 8=2×2×2 ,因此 8 8 8 为立方数。
对于样例 2 2 2,不存在满足条件的正整数,因此 9 9 9 不为立方数。
对于全部数据,保证有 1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个正整数 n
//未知:n 是否是一个立方数。
//关系: 如果存在一个整数 i,满足 i^3 = n,则 n 是一个立方数。
//二、定义变量(已知、未知、关系)
int n; // 定义一个整型变量n,用来存储用户输入的正整数。
bool b = false; // 定义一个布尔变量b,初始化为false,用来标记n是否是立方数。
//三、输入已知
cin >> n; // 从标准输入读取一个整数n,表示要检查的正整数。
//四、根据关系计算
for(int i = 1; i * i * i <= n; ++i){ // 开始一个循环,从1遍历到某个值,使得i*i*i不超过n。
if(i * i * i == n){ // 检查当前的i的立方是否等于n。
b = true; // 如果找到这样的i,设置b为true,表示n是立方数,并结束循环。
break; // 找到立方根后立即退出循环,因为不需要继续检查。
}
}
//五、输出未知
if(b){ // 根据b的值判断并输出结果。
cout << "Yes"; // 如果b为true,表示n是立方数,输出"Yes"。
} else {
cout << "No"; // 否则,输出"No"表示n不是立方数。
}
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202409 一级] 小杨购物
类型:基本运算
题目描述:
小杨有 n n n 元钱用于购物。商品 A 的单价是 a a a 元,商品 B 的单价是 b b b 元。小杨想购买相同数量的商品 A 和商品 B。
请你编写程序帮助小杨计算出他最多能够购买多少个商品 A 和商品 B。
输入:
第一行包含一个正整数 n n n,代表小杨用于购物的金额。
第二行包含一个正整数 a a a,代表商品 A 的单价。
第三行包含一个正整数 b b b,代表商品 B 的单价。
输出:
输出一行,包含一个整数,代表小杨最多能够购买的商品 A 和商品 B 的数量。
样例1:
输入:
12
1
2
输出:
4
样例2:
输入:
13
1
2
输出:
4
提示:
对于样例 1,由于需要购买相同数量的两种商品,因此⼩杨最多能够购买 4 4 4 件商品 A A A 和 4 4 4 件商品 B B B,共花费 1 × 4 + 2 × 4 = 12 1 \times 4 + 2 \times 4 = 12 1×4+2×4=12 元。因此,样例 1 的答案为 4 4 4。
如果小杨想购买 5 5 5 件商品 A A A 和商品 B B B,则需要花费 1 × 5 + 2 × 5 = 15 1 \times 5 + 2 \times 5 = 15 1×5+2×5=15 元,超过了小样的预算 13 13 13 元。因此,样例 2 答案为 4 4 4。
对全部的测试数据,保证 1 ≤ n , a , b ≤ 1 0 5 1 \leq n,a,b \leq 10^5 1≤n,a,b≤105。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:n元,商品A单价a元, 商品B单价b元
//未知:买相同数量的A和B,最多能买多少?
//关系:需要找出n元可以如何分配到a和b上,使得购买的A和B的数量相等且尽可能多。
//二、数据定义
int n,a,b; // 定义三个整型变量,分别用来存储总金额n,商品A的单价a,以及商品B的单价b。
//三、数据输入
cin>>n>>a>>b; // 从标准输入读取三个整数,依次赋值给n, a, 和 b。
//四、数据计算
// 根据题意,每购买一组商品(一件A加一件B),就会花费a+b元。
// 所以,用总金额n除以单组商品的价格(a+b),就可以得到最多能买几组这样的商品对。
// 注意,这里使用的除法是整数除法,会自动向下取整,符合题目要求的“最多”买多少件。
//五、输出结果
cout<<n/(a+b); // 将计算结果输出到标准输出,即屏幕上。这表示最多能买n/(a+b)对商品A和B。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202409 一级] 美丽数字
类型:简单循环
题目描述:
小杨有 n n n 个正整数,他认为一个正整数是美丽数字当且仅当该正整数是 9 9 9 的倍数但不是 8 8 8 的倍数。
小杨想请你编写一个程序计算 n n n 个正整数中美丽数字的数量。
输入:
第一行包含一个整数
n
n
n,代表正整数个数。
第二行有
n
n
n 个正整数
a
1
,
a
2
,
…
a
n
a_1, a_2, \dots a_n
a1,a2,…an。
输出:
输出一个整数,表示其中美丽数字的数量。
样例1:
输入:
3
1 9 72
输出:
1
提示:
- 1 1 1 既不是 9 9 9 的倍数也不是 8 8 8 的倍数。
- 9 9 9 是 9 9 9 的倍数不是 8 8 8 的倍数。
- 72 72 72 既是 9 9 9 的倍数又是 8 8 8 的倍数。
对全部的测试数据,保证 1 ≤ n , a i ≤ 1 0 5 1 \leq n, a_i \leq 10^5 1≤n,ai≤105。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:n个整数。
//未知: n 个正整数中美丽数字的数量。
//关系:美丽数字-当且仅当该正整数是 9 的倍数但不是 8 的倍数。
//二、数据定义
int n, t, c = 0; // 定义三个整型变量:
// n - 表示输入的整数数量;
// t - 临时变量,用来存储每一次读取的整数值;
// c - 计数器,初始化为0,用来累计满足条件的美丽数字的数量。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示接下来要输入的整数个数。
for(int i = 0; i < n; ++i){ // 开始一个循环,循环次数为n,即输入整数的数量。
cin >> t; // 在每次循环中,从标准输入读取一个整数t。
//四、数据计算
if(t % 9 == 0 && t % 8 != 0){ // 检查当前读取的整数t是否是9的倍数(t % 9 == 0)且不是8的倍数(t % 8 != 0)。
++c; // 如果条件成立,则将计数器c加1,表示找到一个新的美丽数字。
}
}
//五、输出结果
cout << c; // 循环结束后,输出计数器c的值,即美丽数字的总数量。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202412 一级] 温度转换
类型:基本运算
题目描述:
小杨最近学习了开尔文温度、摄氏温度和华氏温度的转换。令符号 K K K 表开尔文温度,符号 C C C 表摄氏温度,符号 F F F 表华氏温度,这三者的转换公式如下:
C = K − 273.15 F = C × 1.8 + 32 C=K-273.15\\ F=C\times 1.8+32 C=K−273.15F=C×1.8+32
现在小杨想编写一个程序计算某一开尔文温度对应的摄氏温度和华氏温度,你能帮帮他吗?
输入:
一行,一个实数 K K K,表示开尔文温度。
输出:
一行,若输入开尔文温度对应的华氏温度高于
212
212
212,输出 Temperature is too high!
;
否则,输出两个空格分隔的实数 C C C 和 F F F,分别表示摄氏温度和华氏度,保留两位小数。
样例1:
输入:
412.00
输出:
Temperature is too high!
样例2:
输入:
173.56
输出:
-99.59 -147.26
提示:
0
<
K
<
1
0
5
0<K<10^5
0<K<105。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:一个实数 K,表示开尔文温度。
//未知:对应的摄氏温度和华氏温度,若输入开尔文温度对应的华氏温度高于 212,输出 Temperature is too high!;
//关系:C=K-273.15 F=C×1.8+32
//二、数据定义
double k, c, f; // 定义三个双精度浮点型变量:
// k - 存储用户输入的开尔文温度;
// c - 存储计算后的摄氏温度;
// f - 存储计算后的华氏温度。
//三、数据输入
cin >> k; // 从标准输入读取一个实数k,表示开尔文温度。
//四、数据计算
c = k - 273.15; // 根据公式 C = K - 273.15 将开尔文温度转换为摄氏温度,并存储在c中。
f = c * 1.8 + 32; // 根据公式 F = C * 1.8 + 32 将摄氏温度转换为华氏温度,并存储在f中。
//五、输出结果
if(f > 212){ // 检查华氏温度是否高于212°F。
cout << "Temperature is too high!"; // 如果是,则输出警告信息。
} else {
// 如果华氏温度不超过212°F,则格式化输出摄氏和华氏温度,
// fixed指示以固定小数点格式输出,setprecision(2)设置输出保留两位小数。
cout << fixed << setprecision(2) << c << " " << f;
}
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:[GESP202412 一级] 奇数和偶数
类型:简单循环
题目描述:
小杨有 n n n 个正整数,他想知道其中的奇数有多少个,偶数有多少个。
输入:
第一行包含一个正整数 n n n,代表正整数个数。
之后 n n n 行,每行包含一个正整数。
输出:
输出两个正整数(英文空格间隔),代表奇数的个数和偶数的个数。如奇数或偶数的个数为 0 0 0,则对应输出 0 0 0。
样例:
输入:
5
1
2
3
4
5
输出:
3 2
提示:
对于全部数据,保证有 1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1≤n≤105 且正整数不超过 1 0 5 10^5 105。
完整代码如下:
#include<bits/stdc++.h> // 包含了C++标准库中的所有头文件,方便快捷但不推荐用于实际项目中。
using namespace std; // 使用std命名空间,避免每次使用标准库元素时都得加上std::前缀。
int main(){ // 定义主函数,程序从这里开始执行。
//一、分析问题
//已知:n个正整数
//未知:其中的奇数有多少个,偶数有多少个。
//关系:能被2整除的是偶数,不能被2整除的是奇数。
//二、数据定义
int n, t, j = 0, o = 0; // 定义四个整型变量:
// n - 表示输入的整数数量;
// t - 临时变量,用来存储每一次读取的整数值;
// j - 计数器,初始化为0,用来累计奇数的数量;
// o - 计数器,初始化为0,用来累计偶数的数量。
//三、数据输入
cin >> n; // 从标准输入读取一个整数n,表示接下来要输入的整数个数。
for(int i = 0; i < n; ++i){ // 开始一个循环,循环次数为n,即输入整数的数量。
cin >> t; // 在每次循环中,从标准输入读取一个整数t。
//四、数据计算
if(t % 2 != 0){ // 检查当前读取的整数t是否是奇数(不能被2整除)。
++j; // 如果是奇数,则将奇数计数器j加1。
} else { // 否则,该数是偶数。
++o; // 将偶数计数器o加1。
}
}
//五、输出结果
cout << j << " " << o; // 循环结束后,输出两个计数器的值,分别是奇数和偶数的总数量。
return 0; // 主函数结束,返回0给操作系统,表示程序正常结束。
}
三、感谢
如若本文对您的学习或工作有所启发和帮助,恳请您给予宝贵的支持——轻轻一点,为文章点赞;若觉得内容值得分享给更多朋友,欢迎转发扩散;若认为此篇内容具有长期参考价值,敬请收藏以便随时查阅。
每一次您的点赞、分享与收藏,都是对我持续创作和分享的热情鼓励,也是推动我不断提供更多高质量内容的动力源泉。期待我们在下一篇文章中再次相遇,共同攀登知识的高峰!
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》