题目链接
题目描述
给定一个 n
行 m
列的二维正整数数组 a
,其中 1 <= n, m <= 100
,且 1 <= a[i][j] <= 1000
。请计算数组中所有元素之和。
输入描述:
- 第一行输入两个整数
n
和m
,用空格隔开。 - 接下来
n
行,每行输入m
个整数。
输出描述:
- 输出一个整数,表示二维数组所有元素之和。
示例说明:
- 输入:
3 4 1 2 3 4 5 6 7 8 9 10 11 12
- 输出:
78
解题思路
本题是一个基础的二维数组遍历和求和问题。按照"先输入,再处理"的思路,解法如下:
-
读取维度: 首先,从输入中读取二维数组的行数
n
和列数m
。 -
创建并填充数组:
- 声明一个
n
行m
列的二维数组(或列表)。 - 使用两层嵌套的循环,按顺序读取
n * m
个整数,并将它们填充到创建好的二维数组中。
- 声明一个
-
初始化总和: 定义一个变量
total_sum
用于存储所有元素的累加和。为了防止整数溢出,最好选择一个范围足够大的数据类型。- 数据范围分析: 数组最大为
100x100
,每个元素最大为1000
。总和的最大值可能是100 * 100 * 1000 = 10,000,000
。这个值在标准的int
(32位,约2*10^9
)范围内。但为了养成良好的编程习惯,对于累加问题,使用long long
(C++) 或long
(Java) 是一个更安全的选择。Python 的整数类型可以自动处理大数,无需担心。
- 数据范围分析: 数组最大为
-
遍历与累加:
- 再次使用两层嵌套的循环来遍历内存中已经填充好的二维数组。
- 在循环中,将每个数组元素的值累加到
total_sum
变量上。
-
输出结果: 所有元素都累加完毕后,输出
total_sum
的值。
这种"先存储后处理"的模式在逻辑上更清晰,但也需要 O(N*M)
的额外空间来存储数组。
算法步骤概览:
- 读入
n, m
。 - 创建
n x m
的二维数组arr
。 for i from 0 to n-1:
for j from 0 to m-1:
- 读入一个整数并存入
arr[i][j]
。
- 读入一个整数并存入
- 初始化
total_sum = 0
。 for i from 0 to n-1:
for j from 0 to m-1:
total_sum += arr[i][j]
。
- 输出
total_sum
。
代码
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> arr(n, vector<int>(m));
// 步骤1: 先将所有数据读入二维数组
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> arr[i][j];
}
}
long long total_sum = 0;
// 步骤2: 再遍历数组进行计算
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
total_sum += arr[i][j];
}
}
cout << total_sum << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] arr = new int[n][m];
// 步骤1: 先将所有数据读入二维数组
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
arr[i][j] = sc.nextInt();
}
}
long totalSum = 0;
// 步骤2: 再遍历数组进行计算
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
totalSum += arr[i][j];
}
}
System.out.println(totalSum);
}
}
n, m = map(int, input().split())
# 步骤1: 先将所有数据读入二维列表
arr = []
for _ in range(n):
row = list(map(int, input().split()))
arr.append(row)
# 步骤2: 再遍历列表进行计算
total_sum = 0
for i in range(n):
for j in range(m):
total_sum += arr[i][j]
print(total_sum)
算法及复杂度
- 算法: 遍历求和。
- 时间复杂度:
,因为我们需要两次遍历
N*M
的数据(一次读取,一次计算),总体复杂度仍然是。
- 空间复杂度:
。因为我们需要一个
N*M
大小的二维数组来存储所有输入数据。