文章

【GESP】C++一级练习BCQM3025,输入-计算-输出-6

题型与BCQM3024一样,计算逻辑上稍微复杂了一点点,代码逻辑没变,仍属于小学3,4年级的题目水平。

BCQM3025

题目要求

描述

育才小学四年级二班共有n人,其中参加语文兴趣小组的有a个人,参加数学兴趣小组的有b个人,两者都参加的有c个人,那么有多少人两个小组都没有参加?

输入

在一行输入正整数n(0 < n ≤ 10000)、 a、 b、 c (a,b,c ≤ n且 c < min(a,b))。

输出

输出有多少人两个兴趣小组都没有参加。

输入样例

46 21 18 9

输出样例

1
16

题目分析

代码逻辑不再赘述,稍微介绍一下计算逻辑,这个问题可以通过集合的方式来分析,下面详细讲解解题思路:

1. 分析已知条件

  • 学校四年级二班有 ( n ) 个人。
  • 参加语文兴趣小组的有 ( a ) 个人。
  • 参加数学兴趣小组的有 ( b ) 个人。
  • 两个小组都参加的有 ( c ) 个人。

我们可以用集合来表示这些学生的分布:

  • 设参加语文兴趣小组的学生集合为 ( A ),那么 ( |A| = a )。
  • 设参加数学兴趣小组的学生集合为 ( B ),那么 ( |B| = b )。
  • 两个小组都参加的学生数量为 ( c ),即 ( A $\cap$ B = c )。

2. 使用集合的公式

根据集合的加法原则,我们可以得到参加至少一个兴趣小组的学生数: [ |A $\cup$ B| = |A| + |B| - |A $\cap$ B| = a + b - c ] 其中,( |A $\cup$ B| ) 表示参加至少一个兴趣小组的学生数量。

3. 计算未参加任何小组的学生数

所有学生的总人数是 ( n ),因此没有参加任何兴趣小组的学生数就是: n - |A $\cup$ B| = n - (a + b - c)

代码参考

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main() {
    int n, a, b, c;
    cin >> n >> a >> b >> c;
    cout << n - (a + b - c);
    return 0;
}

孩子的思想。小学的孩子不会集合原理,他用的是最朴素的逻辑,就是找到只上语文的(a-c) + 只上数学的(b-c) + 两个都上的c,那么剩下就是都不上的。化简后是一样的。代码如下:

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main() {
    int n, a, b, c;
    cin >> n >> a >> b >> c;
    cout << n - ((a - c) + (b - c) + c);
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

本文由作者按照 CC BY 4.0 进行授权