Симметричные квадратные матрицы [latex]A[/latex] и [latex]B[/latex] порядка [latex]n[/latex] заданы последовательностями из [latex]n\left(n+1 \right)/2[/latex] чисел, аналогично правым треугольным матрицам. Получить матрицу [latex]AB[/latex].
[latex]n[/latex] | [latex]A[/latex] | [latex]B[/latex] | [latex]AB[/latex] |
3 | 0 1 2 0 2 1 | 0 1 3 0 2 1 | 7 4 4
6 5 5 5 4 11 |
2 | 0 1 0 | 1 0 1 | 0 1
1 0 |
3 | 1 2 3 4 5 6 | 1 0 0 4 2 2 | 1 14 10
2 26 18 3 32 22 |
4 | 1 1 1 1 2 2 2 3 3 4 | 6 6 6 6 5 5 5 3 2 1 | 24 21 16 14
42 36 26 22 54 46 31 25 60 51 33 26 |
Тесты проверены на этом сайте.
Код программы:
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 32 33 34 35 36 37 38 |
#include <iostream> using namespace std; int A[100][100]; int B[100][100]; int C[100][100]; int main() { int n; cin >> n; int i=0, j=0, t=0; for (i=0; i<n; i++) { for (j=i; j<n; j++) { cin >> t; A[i][j]=A[j][i]=t; } } for (i=0; i<n; i++) { for (j=i; j<n; j++) { cin >> t; B[i][j]=B[j][i]=t; } } for (i=0; i<n; i++) { for (j=0; j<n; j++) { for (int k=0; k<n; k++) { C[i][j]+=A[i][k]*B[k][j]; } } } for (i=0; i<n; i++) { for (j=0; j<n; j++) { cout << C[i][j] << "\t"; } cout << endl; } return 0; } |
Алгоритм решения:
Изначально мы считываем последовательность из [latex]n\left(n+1 \right)[/latex] для двух матриц (чтобы они были симметричекими, цикл по столбцам запускается с позиции текущей строки, а затем введённое значение копируется относительно главной диагонали).
Пусть [latex]C=\begin{Vmatrix}c_{ij}\end{Vmatrix} \in M_{m\times n}\left( \mathbb{R}\right) \left(i=1,2,\ldots,m; j=1,2,\ldots,n \right)[/latex].
Умножение матриц происходит по формуле [latex]c_{ij}=\sum_{r=1}^{n}{a_{ir}b_{rj}}\left(i=1,2,\ldots,m; j=1,2,\ldots,n \right)[/latex].
Зачтено, но…
Вы используете «олимпиадный подход» к написанию кода. Но он здесь неприменим.
Когда можно/нужно описывать статические массивы фиксированной размерности вместо динамического их создания?
— Когда заранее известен максимальный размер массивов. Известно количество памяти отведенное для запуска программы. Второе с запасом превышает первое
— Нужно сэкономить время на инициализации нулями.
— Возможно еще что-то что я сейчас упускаю, но надеюсь Олег прочтёт этот комментарий.
В условии задачи нет намеков на то, что размеры матриц будут ограничены каким-то числом.