top1编程
← 返回题目
题解

收花生

1 条题解

  • 0
    @ 2026-8-5 14:24:32

    解题思路

    这是一道非常简单的“二维数组求和”题。

    1. 题意

    花生地是一个 m×n 的二维数组,每个格子里有一棵花生树,格子里写的数字就是这棵树结的花生数。小程想知道一共能收获多少花生——也就是把数组里所有数字加起来。

    2. 怎么求?

    用双重循环,把 m 行、每行 n 个数字全部读进来,一个一个加到 sum 里,最后输出 sum。

    3. 大坑:会不会溢出?

    花生数最大可能到 10 亿,而 m、n 最大是 100,也就是最多有 10000 棵树。万一每棵都结很多,总和可能超过 21 亿(int 能表示的最大值),用 int 会出错!

    所以 sum 一定要用 long long(64 位整数,能表示的最大值大约 9 后面跟 18 个 0),读进来的数字也用 long long,这样就绝对安全了。

    4. 对照样例

    样例里所有数字加起来是 1+2+3+1+2+1+3+3+2+2+2+2=24,输出 24。

    参考代码

    #include <iostream>
    using namespace std;
    int main(){
        // P4528 收花生:把二维数组里的所有数加起来就是收获的花生总数
        int m, n;
        cin >> m >> n;
        long long sum = 0; // 累加器用 long long,防止大数字求和时溢出
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                long long x;
                cin >> x;
                sum += x; // 每棵花生树上的花生都加进来
            }
        }
        cout << sum << endl;
        return 0;
    }
    

    复杂度分析

    数组一共有 m×n 个数,每个数都要读一遍并加一次,所以时间复杂度是 O(m×n)。题目说 3 ≤ m,n ≤ 100,最多 10000 个数,非常快。

    程序只用了几个变量,没有开数组,空间复杂度是 O(1)。

    • 1