Условие
Две правые треугольные матрицы [latex] A [/latex] и [latex] B [/latex] порядка [latex] n [/latex] заданы в виде последовательности [latex] \frac{\left( n + 1 \right) n}{2}[/latex] чисел: сначала идёт [latex] n [/latex] элементов первой строки, затем [latex] n-1 [/latex] элемент второй строки, и т.д. (из последней, [latex] n [/latex] -ой строки берётся только [latex] n [/latex] -ый элемент). Нужно получить в аналогичном виде матрицу
б) [latex] A \left( I + B^{2} \right) [/latex], где [latex] I [/latex] — единичная матрица порядка [latex] n [/latex]
Тест
[latex] \begin{bmatrix} 2 & 2 & 2 \\ 0 & 0 & 3 \\ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} 1 & 2 & 3 \\ 0 & 4 & 5 \\ 0 & 0 & 6 \end{bmatrix} = \begin{bmatrix} 4 & 54 & 236 \\ 0 & 0 & 111 \\ 0 & 0 & 37 \end{bmatrix} [/latex] |
Решение
Создадим класс для работы с треугольными матрицами указанного вида и снабдим его основными методами, необходимыми для решения задачи.
У нас будут конструктор матрицы из стандартного потока ввода, конструктор скалярной матрицы, а также будут перегружены операторы сложения, умножения и присваивания.
Код на С++
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#include <iostream> #include <assert.h> #include <stdlib.h> using namespace std; class TriMat { private: int Size; int** M; public: TriMat(int n) { Size = n; M = (int**) malloc(Size * sizeof(int)); for (int k = 0; k < Size; k++) { M[k] = (int*) malloc((Size - k) * sizeof(int)); for (int j = 0; j <= Size - 1 - k; j++) cin >> M[k][j]; } } // Конструктор скалярной матрицы с заданным элементом на главной диагонали TriMat(int n, int a) { Size = n; M = (int**) malloc(Size * sizeof(int)); for (int k = 0; k < Size; k++) { M[k] = (int*) malloc((Size - k) * sizeof(int)); M[k][0] = a; } } void print() { for (int k = 0; k < Size; k++) { for (int j = 0; j < k; j++) cout << "\t"; for (int j = 0; j <= Size - 1 - k; j++) cout << M[k][j] << "\t"; cout << endl; } } int* operator[](size_t k) { assert(0 <= k && k < Size); return M[k]; } void assign(int i, int j, int a) { assert(0 <= i && i < Size && 0 <= j && j < Size); M[i][j] = a; } int el(int i, int j) { assert(0 <= i && i < Size && 0 <= j && j < Size); return M[i][j]; } TriMat operator+ (TriMat B) { TriMat C(Size); for (int k = 0; k < Size; k++) for (int j = 0; j <= Size - 1 - k; j++) C[k][j] = M[k][j] + B[k][j]; return C; } TriMat operator= (TriMat B) { for (int k = 0; k < Size; k++) for (int j = 0; j <= Size - 1 - k; j++) M[k][j] = B[k][j]; return *this; } TriMat operator* (TriMat B) { TriMat C(Size); for (int k = 0; k < Size; k++) for (int j = k; j < Size; j++) { for (int r = k; r <= j; r++) C[k][j-k] += M[k][r-k] * B[r][j-r]; } return C; } }; int main() { int n; cin >> n; TriMat A(n), B(n), I(n,1), C = A * (I + B*B); A.print(); B.print(); C.print(); return 0; } |
Код на Java
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import java.util.*; import java.lang.*; import java.io.*; class Trimat { int Size; int[][] M; public Trimat(int n, Scanner in) { Size = n; M = new int[Size][]; for (int k = 0; k < Size; k++) { M[k] = new int[Size - k]; for (int j = 0; j < Size - k; j++) M[k][j] = in.nextInt(); } } public Trimat(int n, int a) { Size = n; M = new int[Size][]; for (int k = 0; k < Size; k++) { M[k] = new int[Size - k]; M[k][0] = a; } } public void print() { for (int k = 0; k < Size; k++) { for (int j = 0; j < k; j++) System.out.print("\t"); for (int j = 0; j < Size - k; j++) System.out.format("%d\t", M[k][j]); System.out.println(); } } public Trimat add(Trimat B) { Trimat C = new Trimat(Size, 0); for (int k = 0; k < Size; k++) for (int j = 0; j < Size - k; j++) C.M[k][j] = M[k][j] + B.M[k][j]; return C; } public Trimat mul(Trimat B) { Trimat C = new Trimat(Size, 0); for (int k = 0; k < Size; k++) for (int j = k; j < Size; j++) for (int r = k; r <= j; r++) C.M[k][j-k] += M[k][r-k] * B.M[r][j-r]; return C; } } class Main { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); int n = in.nextInt(); Trimat A = new Trimat(n, in), B = new Trimat(n, in); Trimat I = new Trimat(n,1); Trimat C = A.mul(I.add(B.mul(B))); A.print(); B.print(); C.print(); } } |
Вы забыли написать тесты.
Вы забыли написать тесты всё ещё.
Я не заметил в июне Ваш первый комментарий.
Тест добавлен (он же реализован в обеих версиях на Ideone)