首页 > 编程笔记 > C语言笔记

C语言二维数组每行求和(4种方法)

在C语言中,二维数组的每行求和可以通过多种方法来实现,每种方法都有其特点和适用场景。让我们深入探讨几种常用的方法,并通过代码示例来理解它们的实现。

1. 使用嵌套循环

最直观的方法是使用嵌套循环,也即外层循环遍历每一行,内层循环计算该行的元素和。这种方法简单易懂,适用于大多数情况。

#include <stdio.h>

#define ROWS 3
#define COLS 4

int main() {
    int arr[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int row_sums[ROWS] = {0};

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            row_sums[i] += arr[i][j];
        }
        printf("Row %d sum: %d\n", i, row_sums[i]);
    }

    return 0;
}
运行结果:
Row 0 sum: 10
Row 1 sum: 26
Row 2 sum: 42

2. 使用指针运算

对于熟悉指针操作的程序员来说,使用指针运算可以提供更高的性能,这种方法直接操作内存,减少了数组索引的开销。

#include <stdio.h>

#define ROWS 3
#define COLS 4

int main() {
    int arr[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int row_sums[ROWS] = {0};

    for (int i = 0; i < ROWS; i++) {
        int *row_ptr = arr[i];
        int sum = 0;
        for (int j = 0; j < COLS; j++) {
            sum += *row_ptr++;
        }
        row_sums[i] = sum;
        printf("Row %d sum: %d\n", i, row_sums[i]);
    }

    return 0;
}
运行结果:
Row 0 sum: 10
Row 1 sum: 26
Row 2 sum: 42

3. 使用库函数

C语言的标准库提供了一些有用的函数,如 memcpy 和 memset,虽然这些函数主要用于内存操作,但我们可以巧妙地利用它们来简化我们的代码。

#include <stdio.h>
#include <string.h>

#define ROWS 3
#define COLS 4

int main() {
    int arr[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int row_sums[ROWS];
    memset(row_sums, 0, sizeof(row_sums));

    for (int i = 0; i < ROWS; i++) {
        int temp_sum = 0;
        memcpy(&temp_sum, arr[i], sizeof(int) * COLS);
        for (int j = 0; j < COLS; j++) {
            row_sums[i] += ((unsigned char*)&temp_sum)[j];
        }
        printf("Row %d sum: %d\n", i, row_sums[i]);
    }

    return 0;
}
运行结果:
Row 0 sum: 10
Row 1 sum: 26
Row 2 sum: 42

这种方法虽然看起来复杂,但在某些特定情况下可能会有性能优势。它使用 memcpy 将每行的数据复制到一个临时变量中,然后通过字节操作来计算和。这种方法在处理大型数组时可能会更高效。

4. 使用递归

递归方法虽然不是最高效的,但它展示了一种不同的思维方式,这种方法可以帮助初学者理解递归的概念。

#include <stdio.h>

#define ROWS 3
#define COLS 4

int sum_row(int *row, int col) {
    if (col == 0) return 0;
    return *row + sum_row(row + 1, col - 1);
}

int main() {
    int arr[ROWS][COLS] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    for (int i = 0; i < ROWS; i++) {
        int row_sum = sum_row(arr[i], COLS);
        printf("Row %d sum: %d\n", i, row_sum);
    }

    return 0;
}
运行结果:
Row 0 sum: 10
Row 1 sum: 26
Row 2 sum: 42

这种递归方法通过不断减少列数来计算每行的和,虽然它可能不如迭代方法高效,但它提供了一种优雅的解决方案,特别是对于那些正在学习递归概念的程序员来说。


总起来说,每种方法都有其优点和适用场景:


声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。