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

时间:2018-08-31 02:04:19

标签: c++ matrix

该程序似乎运行良好,但是我的主持人告诉我,如果我输入一个非常大的负数,它将无法正常工作。他还告诉我,它与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;

}

2 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

您的代码存在一些问题:

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

您没有检查n <= 10(数组a的大小是10)

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) {