calculate the sum of diagonals in a matrix

前端 未结 5 1638
梦如初夏
梦如初夏 2020-12-16 01:45

I need to calculate the sum of two diagonals in a matrix in C++, I already have a solution for that but I must be dumb because I cant understand what it is doing, so I would

相关标签:
5条回答
  • 2020-12-16 02:23

    How about I try to explain this version? :D

    There are 3 important parts of the code:

    • inputing the matrix
    • calculating major diagonal ( \ direction)
    • calculating minor diagonal ( / direction)

    And here they are, explained:

    // input elements
    for(i=1;i<=n;i++) // from left to right
    {
        for(j=1;j<=n;j++) // from up to down
            cin>>a[i][j]; // input element at (i,j) position
    }
    

    Here, d and s contain the inter-values of major and minor diagonal respectively. At the end of 2 loops, they will contain the results

    for (i=1;i<=n;i++)
         for (j=1;j<=n;j++)
         {
            if(i==j)          // major diagonal - if coordinates are the same
               d=d+a[i][j];   // e.g. (1,1), (2,2)
            if(j==n-i+1 || i==n-j+1)  // coordinates of the minor diagonal - check
               s=s+a[i][j];           // e.g. n=3 (3,1) (2,2) ...
          }
    

    Hope this helps.

    Note that this code starts matrix coordinates at 1 instead of 0, so you will actually need to allocate (n+1)x(n+1) space for the matrix:

    double a[n+1][n+1];
    

    before using it.

    Also, the code you gave is not most effective. It has O(n^2) complexity, while the task can be done in O(n) like so:

    // matrix coordinates now start from 0
    for (int i=0; i < n; ++i){
        d += a[i][i]; // major
        s += a[i][n-1-i]; // minor
    }
    
    0 讨论(0)
  • 2020-12-16 02:24
    int num[5][5]={0}; //decleration
    int i=0,j=0,sum=0; 
    for (int i=0;i<5;i++)
    {
        for (int j=0;j<5;j++)
        {
            cin>>num[i][j];
        }                          //Taking Matrix input
    }
            cout<<endl<<"The Matrix is "<<endl;
        for (int i=0;i<5;i++)
        {
            for (int j=0;j<5;j++)
            {
                cout<<num[i][j]<<" ";
            }
                cout<<endl;               //Displaying the Matrix
        }                               
    cout<<endl<<"The sum of diagonals of the matrix is "<<endl;
    if(i==j) 
    {
        for (i=0;i<5;i++)
        {
            for (j=0;j<5;j++)
            {
                if (i==j)       //This loop works where i and j will be equal
                {
                sum=sum+num[i][j];
                }
            }
        }
        cout<<sum;
    }
    else   //Some times the user creates 4 x 3 matrix or so than diagonals not match so. . . 
    {
        cout<<"The sum is not Possible";
    }
    
    0 讨论(0)
  • 2020-12-16 02:25

    It would be nice to have comments in English, but, the your code does (second loop):

    browse all rows
      browse all cells
        if i == j (is in main diagonal):
            increase one sum
        if i == n - i + 1 (the other diagonal)
            increase the second sum
    

    The much nicer and much more effective code (using n, instead of n^2) would be:

    for( int i = 0; i < n; i++){
       d += a[i][i];  // main diagonal
       s += a[i][n-i-1]; // second diagonal (you'll maybe need to update index)
    }
    

    This goes straight trough the diagonals (both at the one loop!) and doesn't go trough other items.

    EDIT:

    Main diagonal has coordinates {(1,1), (2,2), ..., (i,i)} (therefor i == j).

    Secondary diagonal has coordinates (in matrix 3x3): {(1,3), (2,2),(3,1)} which in general is: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}. But in C, arrays are indexed from 0, not 1 so you won't need that +1 (probably).

    All those items in secondary diagonal than has to fit condition: i == n - j + 1 (again due to C's indexing from 0 +1 changes to -1 (i=0,, n=3, j=2, j = n - i - 1)).

    You can achieve all this in one loop (code above).

    0 讨论(0)
  • 2020-12-16 02:41
    int diag1=0;
    int diag2=0;
    
    for (i=0;i<n;i++)
     for (j=0;j<n;j++){
    
      if(i==j)  diag1+=a[i][j]; //principal diagonal 
      if(i+j==n-1) diag2+=a[i][j];//secondary diagonal
    

    }

    To understand this algorithm better you should paint a matrix on you notebook and number it's elements with their position in matrix,then apply the algorithm step by step.I'm 100% sure that you will understand

    0 讨论(0)
  • 2020-12-16 02:41

    you must use i + j == n + 1 instead of i + j == n - 1 for secondary diagonal i.e

    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= n; j++)
        {
            if(i == j) 
                d += a[i][j]; //principal diagonal 
            if(i + j == n+1)
                s += a[i][j];//secondary diagonal
    
        }
    }
    
    0 讨论(0)
提交回复
热议问题