Задача:
Даны квадратные матрицы [latex]A[/latex] и [latex]B[/latex] порядка [latex]n[/latex]. Получить матрицу [latex]A(B-E)+C[/latex], где [latex]E[/latex] — единичная матрица порядка [latex]n[/latex], а элементы матрицы [latex]C[/latex] вычисляются по формуле:[latex]C_{ij}=\frac{1}{i+j}\;\;\;\;(i,j=1,2,\ldots,n)[/latex].
Тесты
К сожалению я не разместила здесь тесты к задаче.
Решение
Реализуем хранение матрицы в виде двумерного массива. Операции сложения и вычитания матриц выполняются поэлементно. Умножение требует наличия у левого сомножителя такого же числа столбцов, как и число строк у правого сомножителя. Поэлементно умножаем каждую строку первой матрицы на каждый столбец второй накапливая сумму значений в элементах результирующей матрицы.
Код C++
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 |
#include <iostream> using namespace std; int main() { int n; cin >> n; //ввод из стандартного потока int A[n][n]; int B[n][n]; int Z[n][n]; int H[n][n]; int E[n][n]; float C[n][n]; float Ans[n][n]; for (int i = 0; i < n; i++){ //матрица А for (int j = 0 ; j < n ; j++){ cin >> A[i][j]; } } for (int i = 0; i < n; i++){ //матрица В for (int j = 0 ; j < n ; j++){ cin >> B[i][j]; } } for (int i = 0; i < n; i++){ //единичная матрица Е for (int j = 0 ; j < n ; j++){ if (i == j) E[i][j] = 1; else E[i][j] = 0; } } for (int i = 0; i < n; i++){ //разность матриц В и Е for (int j = 0; j < n; j++){ Z[i][j] = 0; Z[i][j] = B[i][j] - E[i][j]; } } for (int i = 0; i < n; i++){ //умножение матриц А и (В - Е) for (int j = 0; j < n; j++){ H[i][j] = 0; for (int t = 0; t < n; t++){ H[i][j] += A[i][t] * Z[t][j]; } } } for (int i = 0; i < n; i++){ //матрица С for (int j = 0; j < n; j++){ C[i][j] = 0; C[i][j] = 1.0/(i+1 + j+1); } } for (int i = 0; i < n; i++){ //матрица A(B–E)+C for(int j = 0; j < n; j++){ Ans[i][j] = H[i][j] + C[i][j]; printf("%1.2f", Ans[i][j]); cout << " " ; } cout << endl; } return 0; } |
Код C++ на Ideone: A705
Код 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 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner read = new Scanner (System.in); int n = read.nextInt(); //ввод из стандартного потока double A[][] = new double [n][n]; double B[][] = new double [n][n]; double Z[][] = new double [n][n]; double H[][] = new double [n][n]; double E[][] = new double [n][n]; double C[][] = new double [n][n]; double Ans[][] = new double [n][n]; for (int i = 0; i < n; i++){ //матрица А for (int j = 0 ; j < n ; j++){ A[i][j] = read.nextDouble(); } } for (int i = 0; i < n; i++){ //матрица В for (int j = 0 ; j < n ; j++){ B[i][j] = read.nextDouble(); } } for (int i = 0; i < n; i++){ //единичная матрица Е for (int j = 0 ; j < n ; j++){ if (i == j) E[i][j] = 1; else E[i][j] = 0; } } for (int i = 0; i < n; i++){ //разность матриц В и Е for (int j = 0; j < n; j++){ Z[i][j] = 0; Z[i][j] = B[i][j] - E[i][j]; } } for (int i = 0; i < n; i++){ //умножение матриц А и (В - Е) for (int j = 0; j < n; j++){ H[i][j] = 0; for (int t = 0; t < n; t++){ H[i][j] += A[i][t] * Z[t][j]; } } } for (int i = 0; i < n; i++){ //матрица С for (int j = 0; j < n; j++){ C[i][j] = 0; C[i][j] = 1.0/((i+1)+(j+1)); } } for (int i = 0; i < n; i++){ //матрица A(B–E)+C for(int j = 0; j < n; j++){ Ans[i][j] = H[i][j] + C[i][j]; System.out.print(Ans[i][j] + " "); } System.out.println(); } } } |
Код Java на Ideone: A705
Тесты:
№ теста | Размерность матрицы n | Матрица A | Матрица В | Ответ |
1 | 2 | 3 4 2 1 |
2 1 9 0 |
39.50 -0.67
11.33 1.25 |
2 | 4 | 5 5 5 5 0 0 8 7 2 3 4 7 8 6 1 2 |
5 7 3 4 9 8 3 4 2 3 4 5 6 6 6 6 |
105.50 115.33 75.25 90.20
58.33 66.25 66.20 75.17 85.25 89.20 69.17 75.14 100.20 113.17 57.14 71.12 |
3 | 3 | 0 0 0
0 0 0 0 0 0 |
1 0 0
0 1 0 0 0 1 |
0.5 0.33 0.25
0.33 0.25 0.20 0.25 0.20 0.17 |