B2061 整数的个数
一、题目理解
1.1 题目要求
从输入中读取 k 个整数,统计其中数字 1、5、10 分别出现了多少次,并按顺序输出这三个次数。
输入格式:
-
第一行:一个正整数 k,表示接下来要读入的数字个数
-
第二行:k 个整数,用空格隔开
输出格式:
-
第一行:数字 1 出现的次数
-
第二行:数字 5 出现的次数
-
第三行:数字 10 出现的次数
1.2 样例模拟
假设输入为:第一行 8,第二行 1 5 10 1 5 1 3 10。
意思是:一共有 8 个数字,分别是 1、5、10、1、5、1、3、10。
我们逐一统计:
-
数字 1 出现:第 1、4、6 个,共 3 次
-
数字 5 出现:第 2、5 个,共 2 次
-
数字 10 出现:第 3、8 个,共 2 次
-
数字 3 出现:第 7 个,不是我们要统计的目标,忽略
因此输出为三行:第一行 3,第二行 2,第三行 2。
二、核心思想:计数器法
2.1 什么是计数器法?
想象有三个计分牌,分别标记为“1 号”、“5 号”、“10 号”。
-
每读入一个数字,就看看它是几号。
-
如果是 1 号,就给“1 号计分牌”加 1。
-
如果是 5 号,就给“5 号计分牌”加 1。
-
如果是 10 号,就给“10 号计分牌”加 1。
-
如果是其他数字(比如 3、7、100),三块计分牌都不动。
全部数字读完后,三块计分牌上的数字就是我们要的答案。
2.2 为什么这种方法可行?
因为题目只关心 1、5、10 这三个特定数字出现的次数,其他数字一律忽略。所以只需要三个变量分别记录这三个数字的计数,每读入一个数就判断一次,符合条件就加一,不符合就跳过。
三、程序执行流程逐步解析
下面按照程序实际执行的顺序,逐步讲解每一步在做什么。所有代码片段在文末统一给出,这里只讲逻辑。
【第 1 步】程序开始
程序从主函数开始执行。首先需要准备变量:
-
一个用来存放数字个数的变量,记为 k。
-
三个计数器变量,分别记为 sum1、sum5、sum10,用来统计数字 1、5、10 出现的次数。
同时,为了让程序能进行输入输出操作,需要使用标准输入输出流。
【第 2 步】读入数字个数 k
从输入流中读取一个整数,存入 k。这个 k 表示接下来要读入多少个数字。
以假设的样例为例,此时 k = 8。
【第 3 步】初始化三个计数器
将 sum1、sum5、sum10 都初始化为 0。
为什么必须初始化为 0?
因为计数器是用来“累加”的。如果初始值不是 0(比如是随机值),那么统计结果就会出错。C++ 中局部变量不会自动初始化为 0,所以必须手动写等于 0。
【第 4 步】循环读入并统计
这是整个程序的核心部分。使用一个循环,循环变量 i 从 1 开始,每次加 1,直到 i 大于 k 时停止。因此循环体会执行 k 次,正好对应 k 个数字。
(1)读入一个数字
在循环体内定义一个临时变量 x,用来存放当前读入的数字。每次从输入流中读取下一个整数。
以假设的样例为例:
-
第一次循环读入 1
-
第二次循环读入 5
-
第三次循环读入 10
-
第四次循环读入 1
-
第五次循环读入 5
-
第六次循环读入 1
-
第七次循环读入 3
-
第八次循环读入 10
(2)判断并累加
对当前读入的数字 x 做三次独立的判断:
-
判断 x 是否等于 1:如果等于,sum1 加 1。
-
判断 x 是否等于 5:如果等于,sum5 加 1。
-
判断 x 是否等于 10:如果等于,sum10 加 1。
注意: 这里用的是三个独立的 if 语句,而不是 if-else if-else 结构。因为一个数字只可能等于其中一个值(1、5、10 互不相同),所以用独立的 if 也没问题,逻辑清晰。如果题目要求统计的数字有重叠可能(比如“大于5”和“等于10”),就需要考虑用独立 if。
(3)循环结束后
循环结束后,sum1、sum5、sum10 就分别保存了三个数字出现的次数。
【第 5 步】输出结果
按题目要求的顺序输出:
-
第一行输出 sum1
-
第二行输出 sum5
-
第三行输出 sum10
注意题目要求的输出格式:三个数字各占一行,顺序不能乱。
#include<bits/stdc++.h> // 万能头文件 using namespace std; int main() { int k; cin >> k; // 读入数字个数 int sum1 = 0, sum5 = 0, sum10 = 0; // 三个计数器,分别统计 1、5、10 的出现次数,必须初始化为 0 for(int i = 1; i <= k; i++){ // 循环 k 次 int x; cin >> x; // 读入一个数字 if(x == 1){ // 如果当前数字是 1 sum1++; // 1 的计数器加一 } if(x == 5){ // 如果当前数字是 5 sum5++; // 5 的计数器加一 } if(x == 10){ // 如果当前数字是 10 sum10++; // 10 的计数器加一 } } cout << sum1 << endl << sum5 << endl << sum10; // 按顺序输出三个计数器的值 return 0; }

浙公网安备 33010602011771号