计算矩阵中对角线的总和

时间:2012-01-25 18:55:39

标签: c++ algorithm matrix

我需要在C ++中计算矩阵中两个对角线的总和,我已经有了解决方案,但我必须愚蠢因为我无法理解它在做什么,所以我想知道是否还有其他版本我能理解。这是完成工作的代码:

cout<<"Jepi rangun e  matrices"<<endl;  // pra bejme manipulim me matrice katrore ku rreshtat=kolonat
cin>>n;
cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica

for(i=1;i<=n;i++)
{
     for(j=1;j<=n;j++)
        cin>>a[i][j];
}

d=0;
s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme

for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
        if(i==j)
            d=d+a[i][j];
        if(j==n-i+1 || i==n-j+1) 
            s=s+a[i][j];
    }

难以理解的部分是

if(j==n-i+1 || i==n-j+1) 
    s=s+a[i][j];

以下是我更改的整个代码,但它不适用于辅助对角线:

#include <iostream>
using namespace std;

int main()
{
    int d=0,s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme
    int i,j,n;
    int a[5][5];

    cout<<"Jepi rangun e  matrices"<<endl;  // pra bejme manipulim me matrice katrore ku rreshtat=kolonat
    cin>>n;
    cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            cin>>a[i][j];
    }

    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

        }
    }

    cout << d << endl;
    cout << s << endl;
    cin.get();
    cin.get();
    return 0;
}

5 个答案:

答案 0 :(得分:22)

用英语发表评论会很好,但是,你的代码确实如此(第二次循环):

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

更好,更有效的代码(使用n代替n^2)将是:

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)
}

直接穿过对角线(两个都在一个环路上!)并且不会穿过其他物品。

修改

主对角线的坐标为{(1,1), (2,2), ..., (i,i)}(因此为i == j)。

辅助对角线具有坐标(在矩阵3x3中):{(1,3), (2,2),(3,1)},通常为:{(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}。但是在C中,数组的索引是从0开始,而不是1,所以你不需要+1(可能)。

次要对角线上的所有项目都必须符合条件:i == n - j + 1(再次由于C的索引从0 +1变为-1i=0,,{{1 }},n=3j=2))。

你可以在一个循环中完成所有这些(上面的代码)。

答案 1 :(得分:6)

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

}

为了更好地理解这个算法,你应该在笔记本上画一个矩阵,并用矩阵中的位置对它的元素进行编号,然后逐步应用算法。我百分百肯定你会理解

答案 2 :(得分:3)

我试着解释这个版本怎么样? :d

代码有三个重要部分:

  • 输入矩阵
  • 计算主对角线(\ direction)
  • 计算小对角线(/方向)

他们在这里解释说:

// 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
}

这里,d和s分别包含主要和次要对角线的值。在2个循环结束时,它们将包含结果

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) ...
      }

希望这有帮助。

请注意,此代码以1而不是0开始矩阵坐标,因此您实际上需要为矩阵分配(n+1)x(n+1)空间:

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

使用前。

此外,您提供的代码并不是最有效的。它具有O(n^2)复杂度,而任务可以在O(n)中完成,如下所示:

// 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
}

答案 3 :(得分:0)

FACE_COUNT_COLUMN_NAME

答案 4 :(得分:0)

您必须使用i + j == n + 1代替i + j == n - 1作为次要对角线,即

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

    }
}