Старшее четное число по главной диагонали в матрице. Решение для очень больших чисел? - PullRequest
0 голосов
/ 31 августа 2018

программа, кажется, работает очень хорошо, но мой лектор сказал мне, что она не будет работать, если я введу очень большое отрицательное число. Он также сказал мне, что это как-то связано со строкой 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 голосов
/ 31 августа 2018

Хотя мы можем только строить догадки о том, что беспокоит лектора, можно сделать некоторые объективные соображения относительно задачи нахождения наибольшего четного числа под главной диагональю в матрице.

Я сосредоточусь только на поисковом цикле, а не на общей реализации и других проблемах в коде 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;
        }
    }
}

EDIT:

Как указано в комментариях @ user3386109 , с небольшим изменением внутреннего состояния можно инициализировать max более удобным значением, например 0:

if ( (!found || a[i][j] > max)  &&  a[i][j] % 2 == 0)
//    ^^^^^^ checks if it's the first 
0 голосов
/ 31 августа 2018

Некоторые проблемы с вашим кодом:

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

Вы не проверяете, если n <= 10 (10 - размер вашего массива a)

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

Вы начинаете индекс с 1, тогда как индекс массива начинается с 0. Вы можете записать в массив только матрицу 9 × 9. И это также приведет к исключению вне границ, когда i достигает n, а n равно 10.

max = a[i][j];

Перед приведенным выше оператором существует цикл for, в котором i и j были увеличены до n. Если n равно 10, это приведет к исключению вне границ.

И в цикле for после этого вы делаете ту же ошибку:

for (i = 1; i <= n; i++) {
    for (j = 1; j <= n; j++) {
        if (a[i][j] > max) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...