Efficiently compute sums of diagonals of a matrix - GeeksforGeeks

19 May, 2021
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.
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 (O(n ^ 2) :
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: 
C++
Java
Python3
C#
PHP
Javascript
// 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 codeint 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 diagonalsimport 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 diagonalsMAX = 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 codea = [[ 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 diagonalsusing 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
This code takes O(n^2) time and O(1) auxiliary space 
Method 2 (O(n) :
In this method we use one loop i.e. a loop for calculating sum of both the principal and secondary diagonals:  
C++
Java
Python3
C#
PHP
Javascript
// 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 codeint 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 diagonalsimport 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 diagonalsMAX = 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 codea = [[ 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 diagonalsusing 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
This code takes O(n) time and O(1) auxiliary spaceThis article is contributed by Mohak Agrawal. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
vt_m
jit_t
ihritik
subham348
gottumukkalabobby
surinderdawra388
CBSE - Class 11
school-programming
Matrix
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Sudoku | Backtracking-7
Divide and Conquer | Set 5 (Strassen's Matrix Multiplication)
Program to multiply two matrices
Inplace rotate square matrix by 90 degrees | Set 1
Min Cost Path | DP-6
Rotate a matrix by 90 degree in clockwise direction without using any extra space
Python program to multiply two matrices
The Celebrity Problem
Search in a row wise and column wise sorted matrix
Real-time application of Data Structures