Мы все знаем, как найти элементы выше главной диагонали в квадратной матрице. А что если матрица не квадратная, а просто прямоугольная и как найти в ней все элементы выше главной диагонали? Обычным if (i <= j)
не обойдешься.
Допустим есть такой код, который делает все элементы выше диагонали 0, остальные — рандомные:
int n = 10;
int m = 16;
int** arr = (int**)malloc(sizeof(int*)*m);
for (int i = 0; i < m; i++)
{
arr[i] = (int*)malloc(sizeof(int)*n);
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
arr[i][j] = rand() % 9 + 1;
if (i <= j) //Какое-то корректное условие вместо данного
{
arr[i][j] = 0;
}
printf("%d ", arr[i][j]);
}
printf("n");
}
Как правильно решить такую задачу?
Kromster
13.5k12 золотых знаков43 серебряных знака72 бронзовых знака
задан 30 апр 2017 в 20:17
9
Если понимать искомую разделительную линию здесь, как диагональ прямоугольника, то можно предложить следующий подход:
if (i * n < j * m)
arr[i][j] = 2; //выше диагонали
else if (i * n == j * m)
arr[i][j] = 1; //точно на диагонали, таких элементов будет всего НОД(n,m)
else
arr[i][j] = 0; //ниже диагонали
для 6×6:
1 2 2 2 2 2
0 1 2 2 2 2
0 0 1 2 2 2
0 0 0 1 2 2
0 0 0 0 1 2
0 0 0 0 0 1
для 6×9:
1 2 2 2 2 2
0 2 2 2 2 2
0 0 2 2 2 2
0 0 1 2 2 2
0 0 0 2 2 2
0 0 0 0 2 2
0 0 0 0 1 2
0 0 0 0 0 2
0 0 0 0 0 0
ответ дан 14 окт 2018 в 15:28
MBoMBo
47.9k1 золотой знак17 серебряных знаков40 бронзовых знаков
следуя определению главной диагонали которая была дана в комментариях — следующий код напечатает все элементы стоящие выше главной диагонали (кроме самих элементов этой диагонали)
constexpr size_t n = 5, m = 4;
int mat[n][m] =
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{10, 11, 12, 13},
{14, 15, 16, 17}
};
for (size_t i = 0; i < n; i++)
{
for (size_t j = i + 1; j < m; j++)
{
cout << mat[i][j] << ' ';
}
cout << 'n';
}
ответ дан 1 мая 2017 в 18:52
ampawdampawd
3,6841 золотой знак14 серебряных знаков30 бронзовых знаков
1
0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 8 |
|
1 |
|
Вычислить сумму элементов выше главной диагонали матрицы31.07.2012, 14:39. Показов 25327. Ответов 6
ввести двумерный массив b [4,4]. вычислить сумму элементов лежать выше главной диагонали матрицы и отобразить на экране.
0 |
DaskOFF 113 / 113 / 42 Регистрация: 02.05.2012 Сообщений: 524 Записей в блоге: 1 |
||||||||
31.07.2012, 14:59 |
2 |
|||||||
И капсом больше не пишите
Добавлено через 7 минут
1 |
Dr.Urban 63 / 58 / 14 Регистрация: 14.12.2011 Сообщений: 193 |
||||
31.07.2012, 15:09 |
3 |
|||
1 |
nameless 342 / 306 / 36 Регистрация: 16.06.2009 Сообщений: 486 |
||||
31.07.2012, 15:10 |
4 |
|||
Markys,
http://liveworkspace.org/code/… b39e8af6c5
2 |
Dr.Urban 63 / 58 / 14 Регистрация: 14.12.2011 Сообщений: 193 |
||||
31.07.2012, 15:14 |
5 |
|||
Markys,
http://liveworkspace.org/code/… b39e8af6c5 Паскаль мне в резюме, зачем все это?
1 |
342 / 306 / 36 Регистрация: 16.06.2009 Сообщений: 486 |
|
31.07.2012, 15:18 |
7 |
Паскаль мне в резюме, зачем все это? Экспериментирую с boost::multi_array, ничего более..)
0 |
program mas; uses crt; var A: array [1..100,1..100] of integer; i,j,k,n,m:integer; begin clrscr; write('vvedite n = '); readln(n); write('vvedite m = '); readln(m); writeln('Введите элементы массива: '); for i := 1 to n do for j := 1 to m do begin Write('mas[', i, ']'); Write('[', j, ']'); readln(A[i,j]); end; writeln('matrica'); for i:=1 to n do begin for j:=1 to m do write(' ',A[i,j],' '); writeln; end; for i := 1 to n do begin for j := 1 to m do begin if(i<j) then k:=k+1; end; end; writeln('количество элементов выше главной диагонали = ',k); readln; end.
Here is an example case demonstrating how to find the sum in both cases, using nested loop:
matrix = [[i+j for j in range(4)] for i in range(4)]
for row in matrix:
print(" ".join(list(map(str,row))))
totalSum = 0
for i in range(1,len(matrix)):
for j in range(i):
totalSum += matrix[i][j]
print("Below sum: ", totalSum)
totalSum = 0
for i in range(len(matrix)):
for j in range(i+1,len(matrix)):
totalSum += matrix[i][j]
print("Above sum: ", totalSum)
Output:
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
Below sum: 18
Above sum: 18
You can also use these one-liners:
Below diagonal:
totalSum = sum([matrix[i][j] for i in range(1,len(matrix)) for j in range(i)])
Above diagonal:
totalSum = sum([matrix[i][j] for i in range(len(matrix)) for j in range(i+1,len(matrix))])
If you want to sum all numbers above and below the main diagonal you can perform an index check:
totalSum = 0
for i in range(len(matrix)):
for j in range(len(matrix)):
if not i==j:
totalSum += matrix[i][j]
print("Sum: ", totalSum)
Yet, another way of finding that sum (although not recommended) is to find the total sum of the matrix and the sum of the main diagonal and then perform a subtraction to find the final sum:
matrix = [[i+j for j in range(4)] for i in range(4)]
for row in matrix:
print(" ".join(list(map(str,row))))
matrixSum = sum([sum(elem for elem in row) for row in matrix])
diagonalSum = sum([matrix[i][i] for i in range(len(matrix))])
finalSum = matrixSum - diagonalSum
print("Matrix sum: ", matrixSum)
print("Diagonal sum: ", diagonalSum)
print("Final sum: ", finalSum)
Output:
0 1 2 3
1 2 3 4
2 3 4 5
3 4 5 6
Matrix sum: 48
Diagonal sum: 12
Final sum: 36
Note: Mind the syntax in the print
statements as you’re using Python 2 and my answer is in Python 3.