【GESP】C++一级练习 bcqm-3173, 上课点名
GESP一级综合基础练习,涉及循环和基本运算,适合初学者起步练习,难度★☆☆☆☆。 最近12月认证考试刚结束,在将历史刷过的题目总结的同时,会逐步转入二级知识点总结和题目的练习。
bcqm-3173
题目要求
题目描述
马上要上课了,老师发现有一个学生没有来。总共有$n$个学生参加,学生们的学号分别为$1∼n$。老师登记所有到位的学生的学号。老师希望能够帮她写一段代码找出来找到那个没来的学生。
输入格式
第—行是$n$,为需要到位的学生个数。$(1<n<10^6)$。然后$n−1$行,每行一个整数,为到位的学生学号(保证不会有一个学生出现了两次)。
输出格式
一个数,为没有到位的学弟的学号。
样例输入 #1
1
2
3
3
1
3
样例输出 #1
1
2
题目分析
这道题目的解题思路比较简单,主要考察基本的循环和数学运算。我们可以通过以下步骤来解决:
首先,我们知道学生的学号是从1到n的连续整数。这意味着如果所有学生都到齐了,学号的总和应该是1+2+…+n。
然后,我们可以读取实际到位的n-1个学生的学号,并计算这些学号的总和。
最后,用所有学生学号的理论总和减去实际到位学生学号的总和,就能得到那个缺席学生的学号。
例如,对于样例输入:
- n=3,表示应该有3个学生
- 到位的学生学号是1和3
- 所有学号的理论总和是1+2+3=6
- 实际到位学生学号的总和是1+3=4
- 6-4=2,所以缺席的学生学号是2
这种解法的时间复杂度是O(n),空间复杂度是O(1),非常高效。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
int main() {
// 读取总共需要到位的学生个数
int a;
cin >> a;
// 初始化变量b用于读取到位的学生学号
int b;
// 初始化变量ans用于计算所有学生学号的和
int ans = 0;
// 初始化变量sum用于计算到位的学生学号的和
int sum = 0;
// 计算所有学生学号的和
for (int i = 1; i <= a; i++) {
ans += i;
}
// 读取到位的学生学号并计算到位的学生学号的和
for (int i = 2; i <= a; i++) {
cin >> b;
sum += b;
}
// 输出缺席的学生学号
cout << ans - sum;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权