Изучение различных методов вычисления суммы диагоналей матрицы в C++

Вычисление суммы главной и вторичной диагоналей матрицы — распространенная задача в программировании. В этой статье мы рассмотрим несколько способов добиться этого с помощью C++. Мы предоставим примеры кода для каждого метода, чтобы вы могли выбрать тот, который лучше всего соответствует вашим потребностям.

Метод 1: итеративный подход
Итеративный подход включает в себя обход матрицы и отдельное суммирование элементов на первичной и вторичной диагоналях. Вот пример фрагмента кода:

#include <iostream>
using namespace std;
int calculatePrimaryDiagonalSum(int matrix[][N], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += matrix[i][i];
    }
    return sum;
}
int calculateSecondaryDiagonalSum(int matrix[][N], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += matrix[i][size - i - 1];
    }
    return sum;
}
int main() {
    const int N = 3; // Matrix size
    int matrix[N][N] = { {1, 2, 3},
                         {4, 5, 6},
                         {7, 8, 9} };

    int primaryDiagonalSum = calculatePrimaryDiagonalSum(matrix, N);
    int secondaryDiagonalSum = calculateSecondaryDiagonalSum(matrix, N);

    cout << "Primary Diagonal Sum: " << primaryDiagonalSum << endl;
    cout << "Secondary Diagonal Sum: " << secondaryDiagonalSum << endl;

    return 0;
}

Метод 2: использование одного цикла
Если вы хотите вычислить обе диагональные суммы в одном цикле, вы можете использовать модифицированную версию итерационного подхода. Это уменьшает временную сложность за счет обхода матрицы только один раз. Вот пример кода:

#include <iostream>
using namespace std;
void calculateDiagonalSums(int matrix[][N], int size, int& primarySum, int& secondarySum) {
    primarySum = 0;
    secondarySum = 0;

    for (int i = 0; i < size; i++) {
        primarySum += matrix[i][i];
        secondarySum += matrix[i][size - i - 1];
    }
}
int main() {
    const int N = 3; // Matrix size
    int matrix[N][N] = { {1, 2, 3},
                         {4, 5, 6},
                         {7, 8, 9} };

    int primaryDiagonalSum, secondaryDiagonalSum;
    calculateDiagonalSums(matrix, N, primaryDiagonalSum, secondaryDiagonalSum);

    cout << "Primary Diagonal Sum: " << primaryDiagonalSum << endl;
    cout << "Secondary Diagonal Sum: " << secondaryDiagonalSum << endl;

    return 0;
}

Метод 3: использование указателей
Чтобы оптимизировать память и избежать передачи больших матриц функциям, вы можете использовать указатели для перебора элементов матрицы. Вот пример:

#include <iostream>
using namespace std;
int calculatePrimaryDiagonalSum(int* matrix, int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += *(matrix + i * size + i);
    }
    return sum;
}
int calculateSecondaryDiagonalSum(int* matrix, int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += *(matrix + i * size + (size - i - 1));
    }
    return sum;
}
int main() {
    const int N = 3; // Matrix size
    int matrix[N][N] = { {1, 2, 3},
                         {4, 5, 6},
                         {7, 8, 9} };

    int primaryDiagonalSum = calculatePrimaryDiagonalSum(&matrix[0][0], N);
    int secondaryDiagonalSum = calculateSecondaryDiagonalSum(&matrix[0][0], N);

    cout << "Primary Diagonal Sum: " << primaryDiagonalSum << endl;
    cout << "Secondary Diagonal Sum: " << secondaryDiagonalSum << endl;

    return 0;
}

В этой статье мы рассмотрели три различных метода вычисления суммы главной и вторичной диагоналей матрицы с помощью C++. Итеративный подход, одноконтурный подход и метод на основе указателей имеют свои преимущества в зависимости от конкретных требований вашего приложения. Понимая эти методы и примеры их кода, вы сможете выбрать наиболее подходящий для ваших нужд подход. Эффективное вычисление диагональных сумм — это фундаментальная операция при манипулировании матрицами, и эти методы помогут вам выполнить ее в ваших программах на C++.