高效计算矩阵对角线和的 C++ 程序
给定一个二维方阵,求主对角线和次对角线中元素的总和。例如,考虑以下 4 X 4 输入矩阵。
A00 A01 A02 A03
A10 A11 A12 A13
A20 A21 A22 A23
A30 A31 A32 A33
主对角线由元素 A00、A11、A22、A33 形成。
- 主对角线条件:行列条件是行 = 列。
次对角线由元素 A03、A12、A21、A30 形成。 - 次对角线的条件:行列条件是 row = numberOfRows – column -1。
例子 :
Input :
4
1 2 3 4
4 3 2 1
7 8 9 6
6 5 4 3
Output :
Principal Diagonal: 16
Secondary Diagonal: 20
Input :
3
1 1 1
1 1 1
1 1 1
Output :
Principal Diagonal: 3
Secondary Diagonal: 3
方法 1 (O(n ^ 2) :
在这种方法中,我们使用两个循环,即一个循环用于列和一个循环用于行,并且在内部循环中,我们检查上述条件:
C++
// A simple C++ program to find sum of diagonals
#include
using namespace std;
const int MAX = 100;
void printDiagonalSums(int mat[][MAX], int n)
{
int principal = 0, secondary = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// Condition for principal diagonal
if (i == j)
principal += mat[i][j];
// Condition for secondary diagonal
if ((i + j) == (n - 1))
secondary += mat[i][j];
}
}
cout << "Principal Diagonal:" << principal << endl;
cout << "Secondary Diagonal:" << secondary << endl;
}
// Driver code
int main()
{
int a[][MAX] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 },
{ 1, 2, 3, 4 }, { 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
return 0;
}
C++
// An efficient C++ program to find sum of diagonals
#include
using namespace std;
const int MAX = 100;
void printDiagonalSums(int mat[][MAX], int n)
{
int principal = 0, secondary = 0;
for (int i = 0; i < n; i++) {
principal += mat[i][i];
secondary += mat[i][n - i - 1];
}
cout << "Principal Diagonal:" << principal << endl;
cout << "Secondary Diagonal:" << secondary << endl;
}
// Driver code
int main()
{
int a[][MAX] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 },
{ 1, 2, 3, 4 }, { 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
return 0;
}
输出:
Principal Diagonal:18
Secondary Diagonal:18
此代码需要 O(n^2) 时间和 O(1) 辅助空间
方法2(O(n):
在这种方法中,我们使用一个循环,即一个用于计算主对角线和次对角线之和的循环:
C++
// An efficient C++ program to find sum of diagonals
#include
using namespace std;
const int MAX = 100;
void printDiagonalSums(int mat[][MAX], int n)
{
int principal = 0, secondary = 0;
for (int i = 0; i < n; i++) {
principal += mat[i][i];
secondary += mat[i][n - i - 1];
}
cout << "Principal Diagonal:" << principal << endl;
cout << "Secondary Diagonal:" << secondary << endl;
}
// Driver code
int main()
{
int a[][MAX] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 },
{ 1, 2, 3, 4 }, { 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
return 0;
}
输出 :
Principal Diagonal:18
Secondary Diagonal:18
此代码需要 O(n) 时间和 O(1) 辅助空间
有关详细信息,请参阅有关有效计算矩阵对角线和的完整文章!