c++ - 计算矩阵中对角线的总和

标签 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;
}

最佳答案

最好有英文注释,但是,您的代码确实如此(第二个循环):

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 的索引更改为 -1 (i=0,, n=3, j=2, j = n - i - 1)).

您可以在一个循环中实现所有这些(上面的代码)。

关于c++ - 计算矩阵中对角线的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9008505/

相关文章:

C++:如何阻止 map 的 operator[] 插入虚假值?

c++ - 大文件中的 C++ 文件读取错误

algorithm - 算法的对数复杂度

python - 如何在 numpy 中获取两个索引数组之间的矩阵元素?

javascript - 根据数组元素更新矩阵

c++ - 基于 256 位 key 对矩阵进行加扰的方法有哪些?

c++ - 在 C++ 类中初始化二维数组

c++ - 在没有循环的情况下从 C++ 中的 int 中提取 n 个最重要的非零位

c++ - 如何在同一个程序中多次启动和关闭 spdlog?

algorithm - 你从这个 splinter 的随机洗牌中得到什么分布?