Постановка задачи
Суммы по косой. Просуммировать элементы матрицы [latex]A(n,n)[/latex] по каждой из линий, параллельных главной диагонали. Напечатать полученные суммы.
Входные данные:
[latex]n[/latex] — размерность матрицы [latex](n\geq 1)[/latex].
[latex]A[/latex] — квадратная матрица.
Выходные данные:
Суммы элементов матрицы [latex]A[/latex] по каждой из линий, параллельной главной диагонали.
Тесты
№ |
Входные данные |
Выходные данные |
Размерность матрицы [latex](n)[/latex] |
Матрица [latex]A[/latex] |
Суммы |
1 |
2 |
[latex]\begin{pmatrix}
3 & 6\\
-7 & -5
\end{pmatrix} [/latex] |
-7 -2 6 |
2 |
3 |
[latex]\begin{pmatrix}
1 & 2 & 3\\
4 & 5 & 6\\
7 & 8 & 9
\end{pmatrix} [/latex] |
7 12 15 8 3 |
3 |
4 |
[latex]\begin{pmatrix}
4 & 1 & -6 & 3\\
2 & 8 & 19 & 7\\
-8 & -11 & 3 & -13\\
0 & 2 & 16 & -9
\end{pmatrix} [/latex] |
0 -6 7 6 7 1 3 |
Посмотреть работу программы на примере третьего теста можно на сайте ideone.
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
import java.util.*; class task5 { public static void main (String[] args) { int n; Scanner in = new Scanner(System.in); n = in.nextInt(); if (n<1) { System.out.println("Размерность матрицы не может быть меньше 1."); return; } double[][] matrix = new double[n][n]; double[] sum = new double [2*n - 1]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) matrix[i][j] = in.nextDouble(); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) sum[(j-i + n-1] += matrix[i][j]; for (int i=0; i<(2*n-1); i++) System.out.print(sum[i]+" "); } } |
Описание решения
Сначала объявляем переменную
n — размерность матрицы [latex]A[/latex] — и присваиваем ей значение, которое вводит пользователь. Если [latex](n\geq 1)[/latex] — продолжаем работу, иначе выводим сообщение об ошибке и завершаем работу программы.
Теперь, зная размерность матрицы, можем инициализировать 2 массива:
- Двумерный массив
double[][] matrix = new double[n][n]; размерностью [latex](n\times n)[/latex], который будет содержать в себе значения элементов матрицы [latex]A[/latex];
- Массив
double[] sum = new double [2*n - 1]; размерностью [latex](2*n-1)[/latex] для хранения сумм диагоналей. Такая размерность обусловлена следующей логикой: главная диагональ матрицы размерностью [latex](n\times n)[/latex] содержит [latex]n[/latex] элементов. Побочная диагональ, находящаяся выше, содержит в себе уже [latex](n-1)[/latex]
элементов и т.д., пока элементов в диагонали больше нуля. Становится ясно, что выше главной диагонали находится [latex](n-1)[/latex] побочных диагоналей, еще столько же ниже. Прибавляем еще главную диагональ к этому числу и выводим формулу количества диагоналей у матрицы, параллельных главной: [latex]2(n-1)+1=2n-1[/latex].
Заполняем с помощью двух циклов
for массив
matrix из потока ввода, а затем в таких же циклах находим суммы элементов требуемых диагоналей (
sum[(j-i) + (n-1)] += matrix[i][j];).
Известно, что индексы [latex]i,j[/latex] элементов главной диагонали матрицы всегда одинаковы. Аналогично можно заметить, что на побочных диагоналях индекс [latex]j[/latex] отличается от индекса [latex]i[/latex] на число — «расстояние» между главной диагональю и рассматриваемой побочной. К примеру, если рассматривать побочную диагональ, находящуюся выше через одну от главной («расстояние» между ними равно 2), то в таком случае [latex]j-i=2[/latex].
И если на главной диагонали разность индексов будет равна 0, на диагоналях выше эта разность будет числом положительным, а на диагоналях ниже — отрицательным, то при попытке обращения к элементу массива
sum[j-i] мы неизбежно столкнемся с ошибкой, так как индекс массива не может быть числом отрицательным. Значит, чтобы избежать этого, нам надо прибавить к этому индексу некую константу, чтобы самая нижняя диагональ [latex]n-1[/latex] обладала индексом 0 в массиве
sum. Отсюда и формула [latex](j-i+n-1)[/latex].