矩阵中主对角线下的最高偶数。非常大数字的解决方案?

问题描述 投票:0回答:2

该程序似乎工作得很好,但我的导师告诉我,如果我输入一个非常大的负数,它将无法工作。他还告诉我它与行max = a [i] [j]有关。它可以用一行代码计算出来,但由于我是一个纯粹的初学者,我不知道该怎么做。这是代码

int a[10][10], i, j, n, max, amount = 0;
cout << "enter the type of square matrix (nxn) "; cin >> n;
for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
        cout << "enter the element of matrix a[" << i << "][" << j << "]"; cin >> a[i][j];
    }
}

cout << "the matrix is " << endl;
for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
        cout << setw(8)<<a[i][j];
    }
    cout << endl;
}

max = a[i][j];

for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
        if (a[i][j] > max) {
            if (a[i][j] % 2 == 0) {
                if (i > j) {

                    max = a[i][j];
                    amount++;

                }
            }
        }
    }
}

if (amount > 0) {
    cout << "the highest even number under main diagonal is " << max;
}
else cout << "the number does not exist in this matrix " << endl;

return 0;

}

c++ matrix
2个回答
1
投票

虽然我们只能推测讲师的顾虑是什么,但可以对在矩阵中主对角线下找到最大偶数的任务进行客观考虑。

我将只关注搜索循环,而不是OP的代码中的整体实现和其他问题,例如越界访问。

当扫描一系列值以找到最大值时,我们通常将每个元素与一个变量进行比较,比如max,它保存到目前为止找到的较大值,并在找到更大的值时更新。但是应该记住一些注意事项:

  • 最大值可能不存在。如果范围为空,我们无法使用特定元素的值初始化max。没有这样的元素。例如,在OP的情况下,对角线下可能没有偶数(实际上,它们的错误是max用未初始化元素的值初始化,也可能在分配的数组之外)。
  • 我们可以用尽可能低的元素类型值初始化max。在int值的情况下,它是std::numeric_limits<int>::min(),这可能确实是一个非常大的负数(甚至也是如此)。问题是这是一个有效的可能值,所以如果我们只检查更严格的值并且我们只有那个值,那么我们会错过最大值。

此外,在这种特殊情况下,不是遍历整个矩阵检查每个元素是否在对角线下,我们只能遍历矩阵的左下部分。

以下代码段显示了如何考虑这些注意事项:

#include <limits>

int max = std::numeric_limits<int>::min();
bool found = false;

for (int i = 0; i < n; i++) {
    for (int j = 0; j < i; j++) {  // only the elements of a square matrix under the diagonal
        if ( a[i][j] >= max  &&  a[i][j] % 2 == 0 ) {
            max = a[i][j];
            found = true;
        }
    }
}

编辑:

正如@user3386109在评论中指出的那样,内部条件略有变化,有可能将max初始化为更方便的值,如0:

if ( (!found || a[i][j] > max)  &&  a[i][j] % 2 == 0)
//    ^^^^^^ checks if it's the first 

0
投票

您的代码存在一些问题:

cout << "enter the type of square matrix (nxn) "; cin >> n;

你没有检查n <= 10(10是你的阵列a的大小)

for (i = 1; i <= n; i++) 

您从1开始索引,而数组索引从0开始。您现在只能将9 X 9矩阵写入数组。当i达到n并且n为10时,这也会导致出界异常。

max = a[i][j];

在上面的陈述之前,有一个for循环,其中ij已经增加到n。如果n等于10,这将导致超出范围的异常。

在此之后的for循环中你犯了同样的错误:

for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
        if (a[i][j] > max) {
© www.soinside.com 2019 - 2024. All rights reserved.