文章

【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. 首先,我们知道学生的学号是从1到n的连续整数。这意味着如果所有学生都到齐了,学号的总和应该是1+2+…+n。

  2. 然后,我们可以读取实际到位的n-1个学生的学号,并计算这些学号的总和。

  3. 最后,用所有学生学号的理论总和减去实际到位学生学号的总和,就能得到那个缺席学生的学号。

例如,对于样例输入:

  • 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 进行授权