用for循环在C++中打印矩阵二次对角线?

Posted

技术标签:

【中文标题】用for循环在C++中打印矩阵二次对角线?【英文标题】:Print matrix secondary diagonal in C++ with for loop? 【发布时间】:2017-12-24 10:54:42 【问题描述】:

我有一个简单的程序,我想在其中打印矩阵次对角线中的所有元素 - 这些是数字 5、9、13、-21、12,但程序无法按预期工作。我做错了什么?

#include <iostream>
#define SIZE 5
int a[SIZE][SIZE]=
1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
100,-21,-70,345,77,
12,17,765,98,55
;

for(int i=0;i<5;i++)//The first index increases
for(int k=5;k>0;k--)//The second index decreases
cout<<a[i][k]<<endl;//Printing the element

【问题讨论】:

一些关于你的代码的cmets:如果你使用SIZE之类的东西,那么使用是一致的。它应该说for(int i=0;i&lt;SIZE;...。如果您稍后将 SIZE 更改为 4,您的 for 循环将迭代到错误的边界。此外,您应该始终使用缩进。而且我建议始终使用方括号,即使您只有一个命令 - 如果您稍后在忘记省略括号时添加另一个命令,事情就会变糟。 【参考方案1】:

不需要第二个for loop。你可以只用一个:

for (int i = 0; i < SIZE; i++)
    std::cout << a[i][SIZE - i - 1] << ' ';

这样,您可以使用单个 for 循环来获得两个相反方向的索引。

【讨论】:

@Y.Ivanov 换句话说,对角线是一维的,因此迭代它只涉及一个循环。您不会尝试使用两个循环来迭代列。【参考方案2】:

嗯,你做到了

for (k=5; k>0; k--)

但是没有a[0][5]

第一行的最后一个元素是a[0][4] 所以你的数组应该从 4 开始并下降到 0

for (k=4; k>=0; k--)

顺便说一句,只需 1 个循环即可完成。

对于第二条对角线的每个元素,索引之和为 4。

0+4=4
1+3=4
2+2=3
3+1=4
4+0=4

所以你可以写成a[i][4-i]

for(i=0; i<5; i++) 
cout<<a[i][4-i]<<endl;

【讨论】:

【参考方案3】:

尝试这样做:

for(int i=0; i<5; i++) 
    cout << a[i][4-i] << endl;

【讨论】:

为什么我的答案是第一个正确答案时我得到一个减号?

以上是关于用for循环在C++中打印矩阵二次对角线?的主要内容,如果未能解决你的问题,请参考以下文章

常用算法——矩阵对角线元素的表示

4.10 打印数组的主次对角线

如何避免比较相关矩阵中的对角线

如何在 C++ 中快速对角化矩阵?

计算矩阵中对角线的总和

矩阵按对角线打印---python