#include <iostream>
#include <cstdlib>
int** matrix_create(int N, int M);
void matrix_free(int** mat, int N);
int** matrix_miltiply(int& N, int& M, int** m1, int N1, int M1, int** m2, int N2, int M2);
void matrix_rand(int** m, int N, int M, int num);
void matrix_print(std::ostream& _out, int** m, int N, int M);
int main(void){
int N1 = 5, M1 = 3;
int** m1 = matrix_create(N1, M1);
if(m1 == NULL)
return 1;
int N2 = M1, M2 = 8;
int** m2 = matrix_create(N2, M2);
if(m2 == NULL)
return 1;
matrix_rand(m1, N1, M1, 5);
matrix_rand(m2, N2, M2, 7);
int N3, M3;
int** m3 = matrix_miltiply(N3, M3, m1, N1, M1, m2, N2, M2);
if(m3 == NULL)
return 1;
matrix_print(std::cout, m1, N1, M1);
matrix_print(std::cout, m2, N2, M2);
matrix_print(std::cout, m3, N3, M3);
matrix_free(m1, N1);
matrix_free(m2, N2);
matrix_free(m3, N3);
return 0;
}
//перемножение матриц
int** matrix_miltiply(int& N, int& M, int** m1, int N1, int M1, int** m2, int N2, int M2){
if(M1 != N2)
return NULL;
int** m3 = matrix_create(N1, M2);
if(m3 == NULL)
return NULL;
for(int i = 0; i < N1; ++i){
for(int j = 0; j < M2; ++j){
m3[i][j] = 0;
for(int k = 0; k < N2; ++k)
m3[i][j] += m1[i][k] * m2[k][j];
}
}
N = N1, M = M2;
return m3;
}
//выделение памяти для матрицы
int** matrix_create(int N, int M){
int** mat = new (std::nothrow) int*[N];
if(mat == NULL)
return NULL;
for(int i = 0; i < N; ++i){
mat[i] = new (std::nothrow) int[M];
if(mat[i] == NULL){
matrix_free(mat, i);
mat = NULL;
break;
}
}
return mat;
}
//удаление памяти
void matrix_free(int** mat, int N){
if(mat != NULL){
for(int i = 0; i < N; ++i)
delete[] mat[i];
delete[] mat;
}
}
//заполнение
void matrix_rand(int** m, int N, int M, int num){
for(int i= 0 ; i < N; ++i){
for(int j = 0; j < M; ++j)
m[i][j] = rand() % num;
}
}
//печать
void matrix_print(std::ostream& _out, int** m, int N, int M){
for(int i= 0 ; i < N; ++i){
for(int j = 0; j < M; ++j)
_out << m[i][j] << ' ';
_out << std::endl;
}
_out << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KaW50KiogbWF0cml4X2NyZWF0ZShpbnQgTiwgaW50IE0pOwp2b2lkICBtYXRyaXhfZnJlZShpbnQqKiBtYXQsIGludCBOKTsKaW50KiogbWF0cml4X21pbHRpcGx5KGludCYgTiwgaW50JiBNLCBpbnQqKiBtMSwgaW50IE4xLCBpbnQgTTEsIGludCoqIG0yLCBpbnQgTjIsIGludCBNMik7CnZvaWQgIG1hdHJpeF9yYW5kKGludCoqIG0sIGludCBOLCBpbnQgTSwgaW50IG51bSk7CnZvaWQgIG1hdHJpeF9wcmludChzdGQ6Om9zdHJlYW0mIF9vdXQsIGludCoqIG0sIGludCBOLCBpbnQgTSk7CgoKaW50IG1haW4odm9pZCl7CglpbnQgICBOMSA9IDUsIE0xID0gMzsKCWludCoqIG0xID0gbWF0cml4X2NyZWF0ZShOMSwgTTEpOwoJaWYobTEgPT0gTlVMTCkKCQlyZXR1cm4gMTsKCglpbnQgICBOMiA9IE0xLCBNMiA9IDg7CglpbnQqKiBtMiA9IG1hdHJpeF9jcmVhdGUoTjIsIE0yKTsKCWlmKG0yID09IE5VTEwpCgkJcmV0dXJuIDE7CgoJbWF0cml4X3JhbmQobTEsIE4xLCBNMSwgNSk7CgltYXRyaXhfcmFuZChtMiwgTjIsIE0yLCA3KTsKCglpbnQgTjMsIE0zOwoJaW50KiogbTMgPSBtYXRyaXhfbWlsdGlwbHkoTjMsIE0zLCBtMSwgTjEsIE0xLCBtMiwgTjIsIE0yKTsKCWlmKG0zID09IE5VTEwpCgkJcmV0dXJuIDE7CgoJbWF0cml4X3ByaW50KHN0ZDo6Y291dCwgbTEsIE4xLCBNMSk7CgltYXRyaXhfcHJpbnQoc3RkOjpjb3V0LCBtMiwgTjIsIE0yKTsKCW1hdHJpeF9wcmludChzdGQ6OmNvdXQsIG0zLCBOMywgTTMpOwoKCW1hdHJpeF9mcmVlKG0xLCBOMSk7CgltYXRyaXhfZnJlZShtMiwgTjIpOwoJbWF0cml4X2ZyZWUobTMsIE4zKTsKCXJldHVybiAwOwp9CgovL9C/0LXRgNC10LzQvdC+0LbQtdC90LjQtSDQvNCw0YLRgNC40YYKaW50KiogbWF0cml4X21pbHRpcGx5KGludCYgTiwgaW50JiBNLCBpbnQqKiBtMSwgaW50IE4xLCBpbnQgTTEsIGludCoqIG0yLCBpbnQgTjIsIGludCBNMil7CglpZihNMSAhPSBOMikKCQlyZXR1cm4gTlVMTDsKCglpbnQqKiBtMyA9IG1hdHJpeF9jcmVhdGUoTjEsIE0yKTsKCWlmKG0zID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJZm9yKGludCBpID0gMDsgaSA8IE4xOyArK2kpewoJCWZvcihpbnQgaiA9IDA7IGogPCBNMjsgKytqKXsKCQkJbTNbaV1bal0gPSAwOwoJCQlmb3IoaW50IGsgPSAwOyBrIDwgTjI7ICsraykKCQkJCW0zW2ldW2pdICs9IG0xW2ldW2tdICogbTJba11bal07CgkJfQoJfQoJTiA9IE4xLCBNID0gTTI7CglyZXR1cm4gbTM7Cn0KCi8v0LLRi9C00LXQu9C10L3QuNC1INC/0LDQvNGP0YLQuCDQtNC70Y8g0LzQsNGC0YDQuNGG0YsKaW50KiogbWF0cml4X2NyZWF0ZShpbnQgTiwgaW50IE0pewoJaW50KiogbWF0ID0gbmV3IChzdGQ6Om5vdGhyb3cpIGludCpbTl07CglpZihtYXQgPT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCglmb3IoaW50IGkgPSAwOyBpIDwgTjsgKytpKXsKCQltYXRbaV0gPSBuZXcgKHN0ZDo6bm90aHJvdykgaW50W01dOwoJCWlmKG1hdFtpXSA9PSBOVUxMKXsKCQkJbWF0cml4X2ZyZWUobWF0LCBpKTsKCQkJbWF0ID0gTlVMTDsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuIG1hdDsKfQoKLy/Rg9C00LDQu9C10L3QuNC1INC/0LDQvNGP0YLQuAp2b2lkIG1hdHJpeF9mcmVlKGludCoqIG1hdCwgaW50IE4pewoJaWYobWF0ICE9IE5VTEwpewoJCWZvcihpbnQgaSA9IDA7IGkgPCBOOyArK2kpCgkJCWRlbGV0ZVtdIG1hdFtpXTsKCQlkZWxldGVbXSBtYXQ7Cgl9Cn0KCi8v0LfQsNC/0L7Qu9C90LXQvdC40LUKdm9pZCBtYXRyaXhfcmFuZChpbnQqKiBtLCBpbnQgTiwgaW50IE0sIGludCBudW0pewoJZm9yKGludCBpPSAwIDsgaSA8IE47ICsraSl7CgkJZm9yKGludCBqID0gMDsgaiA8IE07ICsraikKCQkJbVtpXVtqXSA9IHJhbmQoKSAlIG51bTsKCX0KfQoKLy/Qv9C10YfQsNGC0YwKdm9pZCBtYXRyaXhfcHJpbnQoc3RkOjpvc3RyZWFtJiBfb3V0LCBpbnQqKiBtLCBpbnQgTiwgaW50IE0pewoJZm9yKGludCBpPSAwIDsgaSA8IE47ICsraSl7CgkJZm9yKGludCBqID0gMDsgaiA8IE07ICsraikKCQkJX291dCA8PCBtW2ldW2pdIDw8ICcgJzsKCQlfb3V0IDw8IHN0ZDo6ZW5kbDsKCX0KCV9vdXQgPDwgc3RkOjplbmRsOwkKfQ==