Efficiently compute sums of diagonals of a matrix
Given a 2D square matrix, find the sum of elements in Principal and Secondary diagonals. For example, consider the following 4 X 4 input matrix.
A00 A01 A02 A03 A10 A11 A12 A13 A20 A21 A22 A23 A30 A31 A32 A33
The primary diagonal is formed by the elements A00, A11, A22, A33.
- Condition for Principal Diagonal: The row-column condition is row = column.
The secondary diagonal is formed by the elements A03, A12, A21, A30. - Condition for Secondary Diagonal: The row-column condition is row = numberOfRows - column -1.
Examples :
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
Method 1: In this method, we use two loops i.e. a loop for columns and a loop for rows and in the inner loop we check for the condition stated above:
Implementation:
// A simple C program to
// find sum of diagonals
#include <stdio.h>
const int M = 4;
const int N = 4;
void printDiagonalSums(int mat[M][N])
{
int principal = 0, secondary = 0;
for (int i = 0; i < M; 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];
}
}
printf("%s", "Principal Diagonal:");
printf("%d\n", principal);
printf("%s", "Secondary Diagonal:");
printf("%d\n", secondary);
}
// Driver code
int main()
{
int a[][4] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{1, 2, 3, 4},
{5, 6, 7, 8}};
printDiagonalSums(a);
return 0;
}
// A simple C++ program to find sum of diagonals
#include <bits/stdc++.h>
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;
}
// A simple java program to find
// sum of diagonals
import java.io.*;
public class GFG {
static void printDiagonalSums(int [][]mat,
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];
}
}
System.out.println("Principal Diagonal:"
+ principal);
System.out.println("Secondary Diagonal:"
+ secondary);
}
// Driver code
static public void main (String[] args)
{
int [][]a = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
}
}
// This code is contributed by vt_m.
# A simple Python program to
# find sum of diagonals
MAX = 100
def printDiagonalSums(mat, n):
principal = 0
secondary = 0;
for i in range(0, n):
for j in range(0, n):
# Condition for principal diagonal
if (i == j):
principal += mat[i][j]
# Condition for secondary diagonal
if ((i + j) == (n - 1)):
secondary += mat[i][j]
print("Principal Diagonal:", principal)
print("Secondary Diagonal:", secondary)
# Driver code
a = [[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ]]
printDiagonalSums(a, 4)
# This code is contributed
# by ihritik
// A simple C# program to find sum
// of diagonals
using System;
public class GFG {
static void printDiagonalSums(int [,]mat,
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];
}
}
Console.WriteLine("Principal Diagonal:"
+ principal);
Console.WriteLine("Secondary Diagonal:"
+ secondary);
}
// Driver code
static public void Main ()
{
int [,]a = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
}
}
// This code is contributed by vt_m.
<?php
// A simple PHP program to
// find sum of diagonals
$MAX = 100;
function printDiagonalSums($mat, $n)
{
global $MAX;
$principal = 0;
$secondary = 0;
for ($i = 0; $i < $n; $i++)
{
for ($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];
}
}
echo "Principal Diagonal:" ,
$principal ,"\n";
echo "Secondary Diagonal:",
$secondary ,"\n";
}
// Driver code
$a = array (array ( 1, 2, 3, 4 ),
array ( 5, 6, 7, 8 ),
array ( 1, 2, 3, 4 ),
array ( 5, 6, 7, 8 ));
printDiagonalSums($a, 4);
// This code is contributed by ajit
?>
<script>
// A simple Javascript program to find sum of diagonals
const MAX = 100;
void printDiagonalSums(mat, n)
{
let principal = 0, secondary = 0;
for (let i = 0; i < n; i++) {
for (let 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];
}
}
document.write("Principal Diagonal:" + principal + "<br>");
document.write("Secondary Diagonal:" + secondary + "<br>");
}
// Driver code
let a = [ [ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ],
[ 1, 2, 3, 4 ], [ 5, 6, 7, 8 ] ];
printDiagonalSums(a, 4);
// This code is contributed by subhammahato348.
</script>
Output
Principal Diagonal:18 Secondary Diagonal:18
Time Complexity: O(N*N), as we are using nested loops to traverse N*N times.
Auxiliary Space: O(1), as we are not using any extra space.
Method 2( Efficient Approach): In this method, we use one loop i.e. a loop for calculating the sum of both the principal and secondary diagonals:
Implementation:
// An efficient C program to find
// sum of diagonals
#include <stdio.h>
#include <stdlib.h>
const int M = 4;
const int N = 4;
void printDiagonalSums(int mat[M][N])
{
int principal = 0, secondary = 0;
for (int i = 0; i < N; i++)
{
principal += mat[i][i];
secondary += mat[i][N - i - 1];
}
printf("%s","Principal Diagonal:");
printf("%d\n", principal);
printf("%s", "Secondary Diagonal:");
printf("%d\n", secondary);
}
// Driver code
int main()
{
int a[4][4] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{1, 2, 3, 4},
{5, 6, 7, 8}};
printDiagonalSums(a);
return 0;
}
// An efficient C++ program to find sum of diagonals
#include <bits/stdc++.h>
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;
}
// An efficient java program to find
// sum of diagonals
import java.io.*;
public class GFG {
static void printDiagonalSums(int [][]mat,
int n)
{
int principal = 0, secondary = 0;
for (int i = 0; i < n; i++) {
principal += mat[i][i];
secondary += mat[i][n - i - 1];
}
System.out.println("Principal Diagonal:"
+ principal);
System.out.println("Secondary Diagonal:"
+ secondary);
}
// Driver code
static public void main (String[] args)
{
int [][]a = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
}
}
// This code is contributed by vt_m.
# A simple Python3 program to find
# sum of diagonals
MAX = 100
def printDiagonalSums(mat, n):
principal = 0
secondary = 0
for i in range(0, n):
principal += mat[i][i]
secondary += mat[i][n - i - 1]
print("Principal Diagonal:", principal)
print("Secondary Diagonal:", secondary)
# Driver code
a = [[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ]]
printDiagonalSums(a, 4)
# This code is contributed
# by ihritik
// An efficient C#program to find
// sum of diagonals
using System;
public class GFG {
static void printDiagonalSums(int [,]mat,
int n)
{
int principal = 0, secondary = 0;
for (int i = 0; i < n; i++) {
principal += mat[i,i];
secondary += mat[i,n - i - 1];
}
Console.WriteLine("Principal Diagonal:"
+ principal);
Console.WriteLine("Secondary Diagonal:"
+ secondary);
}
// Driver code
static public void Main ()
{
int [,]a = { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 } };
printDiagonalSums(a, 4);
}
}
// This code is contributed by vt_m.
<?php
// An efficient PHP program
// to find sum of diagonals
$MAX = 100;
function printDiagonalSums($mat, $n)
{
global $MAX;
$principal = 0; $secondary = 0;
for ($i = 0; $i < $n; $i++)
{
$principal += $mat[$i][$i];
$secondary += $mat[$i][$n - $i - 1];
}
echo "Principal Diagonal:" ,
$principal ,"\n";
echo "Secondary Diagonal:" ,
$secondary ,"\n";
}
// Driver Code
$a = array(array(1, 2, 3, 4),
array(5, 6, 7, 8),
array(1, 2, 3, 4),
array(5, 6, 7, 8));
printDiagonalSums($a, 4);
// This code is contributed by aj_36
?>
<script>
// An efficient Javascript program to find
// sum of diagonals
function printDiagonalSums(mat,n)
{
let principal = 0, secondary = 0;
for (let i = 0; i < n; i++) {
principal += mat[i][i];
secondary += mat[i][n - i - 1];
}
document.write("Principal Diagonal:"
+ principal+"<br>");
document.write("Secondary Diagonal:"
+ secondary);
}
// Driver code
let a = [[ 1, 2, 3, 4 ],
[5, 6, 7, 8 ],
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ]];
printDiagonalSums(a, 4);
// This code is contributed Bobby
</script>
Output
Principal Diagonal:18 Secondary Diagonal:18
Time Complexity: O(N), as we are using a loop to traverse N times.
Auxiliary Space: O(1), as we are not using any extra space.