我已经找到了与此问题相关的一些答案,但我并没有真正了解它们的工作原理。我需要找到二维中每一行的最大总和并将其打印出来,但不要打印任何其他总和。以下是我到目前为止的情况:
#include <iostream>
using namespace std;
int main (int argc, char ** argv)
{
int v[3][5]; // 3 rows, then 5 columns
for (int i=0; i<3; i++){
for (int j=0; j<5; j++){
cin >> v[i][j];
}
}
//test reading value
for (int i=0; i<3; i++){
for (int j=0; j<5; j++){
cout << v[i][j];
if (i!=4)
cout << ' ';
}
cout << '\n';
}
//solve it
for (int i=0; i<3; i++){
int sum = 0;
for (int j=0; j<5; j++){
sum += v[i][j];
}
cout << sum << '\n';
}
return 0;
}
这段代码现在打印出2D数组中每一行的总和,但我需要我的程序才能打印出最大的行数。这是我现在唯一的问题。提前谢谢。
答案 0 :(得分:2)
您可以通过跟踪为数组的每一行计算的最大总和来实现此目的。
//solve it
int largestSum = 0;
for (int i = 0; i<3; i++)
{
int sum = 0;
for (int j = 0; j<5; j++)
{
sum += v[i][j];
}
// check to see if we have computed a new larger sum and save it if we have.
if (sum > largestSum)
{
largestSum = sum;
}
}
cout << "largest sum: " << largestSum << '\n';
或者,如果允许您使用C ++标准库中的其他组件,则可以使用std::accumulate
来计算总和而不是使用内部外观,并使用std::max
来确定当前和以前计算过的总和。
#include <algorithm>
#include <numeric>
//solve it
int largestSum = 0;
for (int i = 0; i<3; i++)
{
int sum = std::accumulate(std::begin(v[i]), std::end(v[i]), 0);
largestSum = std::max(sum, largestSum);
}
cout << "largest sum: " << largestSum << '\n';
答案 1 :(得分:2)
这是我能提出的最短解决方案,也正确处理负数(C ++ 11):
int maxSum = std::numeric_limits<int>::min();
for (const auto& row : v)
maxSum = std::max(maxSum, std::accumulate(std::begin(row), std::end(row), 0));
std::cout << maxSum << std::endl;
答案 2 :(得分:1)
int biggestSum = 0;
for (int i=0; i<3; i++) {
int currentSum = 0; // sum of values in this row
for (int j=0; j<5; j++){
currentSum += v[i][j];
}
if ( currentSum > biggestSum) biggestSum = currentSum; // we have new max
}
cout << biggestSum << '\n';