我需要在 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/