【GESP】C++一级练习BCQM3025,输入-计算-输出-6
题型与BCQM3024一样,计算逻辑上稍微复杂了一点点,代码逻辑没变,仍属于小学3,4年级的题目水平。
BCQM3025 输入-计算-输出-6
题目要求
描述
育才小学四年级二班共有n人,其中参加语文兴趣小组的有a个人,参加数学兴趣小组的有b个人,两者都参加的有c个人,那么有多少人两个小组都没有参加?
输入
在一行输入正整数 $n$ $(0 < n \leq 10000)$、$a$、$b$、$c$ $(a,b,c \leq 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
9
10
#include <iostream>
using namespace std;
int main() {
int n, a, b, c;
// 输入班级总人数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
9
10
11
12
#include <iostream>
using namespace std;
int main() {
int n, a, b, c;
// 输入班级总人数n,参加语文兴趣小组的人数a,参加数学兴趣小组的人数b,两个小组都参加的人数c
cin >> n >> a >> b >> c;
// 计算两个兴趣小组都没有参加的人数
// 只上语文的人数:(a-c),只上数学的人数:(b-c),两个都上的人数:c
// 因此都不上的人数 = 总人数 - (只上语文的 + 只上数学的 + 两个都上的)
cout << n - ((a - c) + (b - c) + c);
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
“luogu-”系列题目可在洛谷题库进行在线评测。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助