题解
【入门】奇偶统计?
1 条题解
-
0
解题思路
这道题要我们在一个 n 行 m 列的表格(二维数组)里,数一数里面有多少个奇数、多少个偶数。
先复习一下什么是奇数、偶数:
- 偶数:能被 2 整除的数,比如 2、4、6、8。
- 奇数:不能被 2 整除的数,比如 1、3、5、7。
怎么判断一个数是奇数还是偶数呢?只要用这个数除以 2 看余数就行:
- 如果 x % 2 == 0,说明 x 除以 2 正好除尽、余数是 0,那 x 就是偶数;
- 如果 x % 2 != 0,说明 x 除以 2 余 1,那 x 就是奇数。
这里的 % 是取余运算,算的是除法剩下的余数,比如 3 % 2 = 1,6 % 2 = 0。
具体怎么做?表格有 n 行 m 列,我们就用双重循环:外层循环 i 控制行数,内层循环 j 控制列数,这样就能把表格里的每一个数都读一遍。每读到一个数,立刻判断它是奇数还是偶数,然后分别计数。
拿题目样例来走一遍。输入:
2 2 2 3 4 6表格是 2 行 2 列,一共 4 个数,我们一个一个看:
- 第 1 个:2,2 % 2 == 0,是偶数,偶数个数变成 1;
- 第 2 个:3,3 % 2 == 1,是奇数,奇数个数变成 1;
- 第 3 个:4,4 % 2 == 0,是偶数,偶数个数变成 2;
- 第 4 个:6,6 % 2 == 0,是偶数,偶数个数变成 3。
数完啦!奇数 1 个、偶数 3 个,所以输出 "1 3",和题目样例完全一样。
再举一个例子,如果输入:
2 3 1 2 3 4 5 6一共 6 个数,1、3、5 是奇数(3 个),2、4、6 是偶数(3 个),输出就是 "3 3"。
这里有一个很重要的小技巧:我们根本不用真的开一个二维数组把所有数都存下来。因为统计只需要知道"这个数是奇数还是偶数",读完一个、数完它、就可以直接扔掉,读一个处理一个就行。这样写既简单,又省内存。
参考代码
// P374 奇偶统计 // 统计 n 行 m 列的二维数组中奇数和偶数各有多少个 #include <iostream> using namespace std; int main() { int n, m; // n 行 m 列 int x; // 临时存放读进来的每一个数 int odd = 0; // 奇数个数 int even = 0; // 偶数个数 int i, j; // 循环变量 // 第一步:读入行数和列数 cin >> n >> m; // 第二步:双重循环,把 n 行 m 列的每个数都读一遍 for (i = 1; i <= n; i++) { for (j = 1; j <= m; j++) { cin >> x; // 读入一个数 if (x % 2 == 0) { // 能被 2 整除就是偶数 even++; // 偶数个数加 1 } else { // 否则就是奇数 odd++; // 奇数个数加 1 } } } // 第三步:输出结果,先是奇数个数,再是偶数个数 cout << odd << " " << even << endl; return 0; }复杂度分析
- 时间复杂度:O(n × m)。双重循环一共要读 n × m 个数,每个数只处理一次。题目说 n、m 最大都是 100,最多 100 × 100 = 10000 个数,非常快。
- 空间复杂度:O(1)。我们只用了 n、m、x、odd、even 这几个普通变量,没有开数组,占用的空间是固定不变的。
- 1