如何使用vector<vector<int>>找到严格高于矩阵次对角线的元素之和?
Posted
技术标签:
【中文标题】如何使用vector<vector<int>>找到严格高于矩阵次对角线的元素之和?【英文标题】:How to find the sum of the elements strictly above the secondary diagonal of the matrix using vector<vector<int>>? 【发布时间】:2020-04-18 09:43:06 【问题描述】:如果输入是:
4
1 6 3 1
6 1 3 1
1 3 1 6
3 1 6 1
我的输出应该是:
18
1 + 6 + 3 + 6 + 1 + 1 = 18
第二条对角线是从右上角开始到左下角的对角线
1
3
3
3
我需要找到严格高于第二条对角线的元素的总和。
这是我目前的代码:
int n , sum = 0;
cin >> n;
vector<vector<int>> A(n);
for (auto rows : A)
for (auto elements : rows)
cin >> elements;
for(auto x : A)
sum += A[x] [n - x];
cout << sum;
我是矩阵向量的新手。另外,如果你们知道我可以在哪里提高我的矢量技能,并更好地理解 stl 矢量,您的建议将非常有帮助!
如果您能帮助我,将不胜感激!
谢谢大家的回答!
【问题讨论】:
我是矩阵向量的新手 -- 使用与使用[][]
的常规二维数组完全相同的语法来检索或设置元素
@PaulMcKenzie 如果你能帮助我编写代码,那将非常有帮助!
输入的第二条对角线是 (1,3,3,3) 而不是 (1,3,3,1)
A std::vector<vector<int>>
不仅需要设置行数,还需要设置内部向量的大小。您的代码只做第一件事,而不做第二件事。
@BlueTune 我改了
【参考方案1】:
对于初学者,向量应定义为
vector<vector<int>> A(n, std::vector<int>( n ) );
这些循环应该使用对对象的引用
for (auto &rows : A)
for (auto &elements : rows)
cin >> elements;
要查找总和,您可以使用索引变量,例如
long long int sum = 0;
for ( auto n = A.size(); n-- != 0; )
for ( std::vector<int>::size_type i = 0; i < n; i++ )
sum += A[A.size() - n - 1][i];
这是一个演示程序
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
int main()
size_t n = 0;
std::cout << "Enter the size of a matrix: ";
std::cin >> n;
std::vector<std::vector<int>> v( n, std::vector<int>( n ) );
std::srand( ( unsigned int )std::time( nullptr ) );
for ( auto &row : v )
for ( auto &item : row ) item = std::rand() % n;
for ( const auto &row : v )
for ( const auto &item : row ) std::cout << item << ' ';
std::cout << '\n';
long long int sum = 0;
for ( auto n = v.size(); n-- != 0; )
for ( std::vector<int>::size_type i = 0; i < n; i++ )
sum += v[v.size() - n - 1][i];
std::cout << "\nThe sum is equal to " << sum << '\n';
return 0;
它的输出可能看起来像
Enter the size of a matrix: 5
4 4 0 2 0
1 4 4 3 3
3 3 1 0 4
2 0 2 3 2
2 1 3 0 3
The sum is equal to 27
【讨论】:
它有效,但你能解释一下这部分for ( std::vector<int>::size_type i = 0; i < n; i++ )
,为什么在for循环中使用向量和size_type。谢谢
@MogovanJonathan: std::vector<int>::size_type
主要只是std::size_t
@MogovanJonathan 对于向量的大小,类模板 std::vector 为无符号整数类型引入了一个别名,名为 size_type。这是一个普通的 for 循环。请参阅我的更新答案。
@VladfromMoscow 我接受了你的回答。谢谢!另外,你在哪里学的 vector使用索引:
...
for (int i = 0; i < A.size(); i++)
for (int j = 0; j < A[i].size() - i; j++)
sum += A[i][j];
...
【讨论】:
这如何回答这个问题? @ArminMontigny 先阅读问题,然后你就会明白它是如何回答问题的以上是关于如何使用vector<vector<int>>找到严格高于矩阵次对角线的元素之和?的主要内容,如果未能解决你的问题,请参考以下文章