#include <iostream>
using namespace std;
struct matrix{
int x;
int y;
int num;
};
int ** SQUARE_MATRIX_MULTIPLY_RECURSIVE(int **&A,int **&B,int num);
int main()
{
int num;
cout<<"请输入你想要相乘的两个矩阵的阶数:"<<endl;
cin>>num;
int **A=new int*[num];
int **B=new int*[num];
int **conclusion=new int* [num];
for(int i=0;i<num;i++){
A[i]=new int[num];
B[i]=new int[num];
conclusion[i]=new int[num];
}
cout<<"请输入A矩阵:"<<endl;
for (int m=0;m<num;m++){
for (int n=0;n<num;n++){
cin>>A[m][n];
}
}
cout<<"请输入B矩阵:"<<endl;
for (int m=0;m<num;m++){
for (int n=0;n<num;n++){
cin>>B[m][n];
}
}
conclusion=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A,B,num);
for (int m=0;m<num;m++){
for (int n=0;n<num;n++){
cout<<conclusion[m][n]<<" ";
}
cout<<endl;
}
}
int ** SQUARE_MATRIX_MULTIPLY_RECURSIVE(int **&A,int **&B,int n){
if (n==1){
int **one=new int*[1];
one[0]=new int [1];
one[0][0]=A[0][0]*B[0][0];
return one;
}else{
int **S1=new int* [n/2];
int **S2=new int* [n/2];
int **S3=new int* [n/2];
int **S4=new int* [n/2];
int **S5=new int* [n/2];
int **S6=new int* [n/2];
int **S7=new int* [n/2];
int **S8=new int* [n/2];
int **S9=new int* [n/2];
int **S10=new int* [n/2];
int **P1=new int* [n/2];
int **P2=new int* [n/2];
int **P3=new int* [n/2];
int **P4=new int* [n/2];
int **P5=new int* [n/2];
int **P6=new int* [n/2];
int **P7=new int* [n/2];
int **A11=new int* [n/2];
int **A22=new int* [n/2];
int **B11=new int* [n/2];
int **B22=new int* [n/2];
for(int i=0;i<n/2;i++){
S1[i]=new int[n/2];
S2[i]=new int[n/2];
S3[i]=new int[n/2];
S4[i]=new int[n/2];
S5[i]=new int[n/2];
S6[i]=new int[n/2];
S7[i]=new int[n/2];
S8[i]=new int[n/2];
S9[i]=new int[n/2];
S10[i]=new int[n/2];
P1[i]=new int[n/2];
P2[i]=new int[n/2];
P3[i]=new int[n/2];
P4[i]=new int[n/2];
P5[i]=new int[n/2];
P6[i]=new int[n/2];
P7[i]=new int[n/2];
A11[i]=new int[n/2];
B11[i]=new int[n/2];
A22[i]=new int[n/2];
B22[i]=new int[n/2];
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S1[i][m]=B[0+i][n/2+m]-B[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S2[i][m]=A[0+i][0+m]+A[i+0][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S3[i][m]=A[n/2+i][0+m]+A[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S4[i][m]=B[n/2+i][0+m]-B[0+i][0+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S5[i][m]=A[0+i][0+m]+A[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S6[i][m]=B[0+i][0+m]+B[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S7[i][m]=A[0+i][n/2+m]-A[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S8[i][m]=B[n/2+i][0+m]+B[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S9[i][m]=A[0+i][0+m]-A[n/2+i][0+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
A11[i][m]=A[0+i][0+m];
A22[i][m]=A[n/2+i][n/2+m];
B11[i][m]=B[0+i][0+m];
B22[i][m]=B[n/2+i][n/2+m];
}
}
P1=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A11,S1,n/2);
P2=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S2,B22,n/2);
P3=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S3,B11,n/2);
P4=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A22,S4,n/2);
P5=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S5,S6,n/2);
P6=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S7,S8,n/2);
P7=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S9,S10,n/2);
//如果是强行使用的是我们平时所使用的计算矩阵乘法的方法的话,那么所得到的
int ** conclusion=new int*[n];
for (int i=0;i<n;i++)
conclusion[i]=new int[n];
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
conclusion[0+i][0+m]=P5[i][m]+P4[i][m]-P2[i][m]+P6[i][m];
conclusion[0+i][n/2+m]=P1[i][m]+P2[i][m];
conclusion[n/2+i][0+m]=P3[i][m]+P4[i][m];
conclusion[n/2+i][n/2+m]=P1[i][m]+P5[i][m]-P3[i][m]-P7[i][m];
}
}
return conclusion;
}
}
using namespace std;
struct matrix{
int x;
int y;
int num;
};
int ** SQUARE_MATRIX_MULTIPLY_RECURSIVE(int **&A,int **&B,int num);
int main()
{
int num;
cout<<"请输入你想要相乘的两个矩阵的阶数:"<<endl;
cin>>num;
int **A=new int*[num];
int **B=new int*[num];
int **conclusion=new int* [num];
for(int i=0;i<num;i++){
A[i]=new int[num];
B[i]=new int[num];
conclusion[i]=new int[num];
}
cout<<"请输入A矩阵:"<<endl;
for (int m=0;m<num;m++){
for (int n=0;n<num;n++){
cin>>A[m][n];
}
}
cout<<"请输入B矩阵:"<<endl;
for (int m=0;m<num;m++){
for (int n=0;n<num;n++){
cin>>B[m][n];
}
}
conclusion=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A,B,num);
for (int m=0;m<num;m++){
for (int n=0;n<num;n++){
cout<<conclusion[m][n]<<" ";
}
cout<<endl;
}
}
int ** SQUARE_MATRIX_MULTIPLY_RECURSIVE(int **&A,int **&B,int n){
if (n==1){
int **one=new int*[1];
one[0]=new int [1];
one[0][0]=A[0][0]*B[0][0];
return one;
}else{
int **S1=new int* [n/2];
int **S2=new int* [n/2];
int **S3=new int* [n/2];
int **S4=new int* [n/2];
int **S5=new int* [n/2];
int **S6=new int* [n/2];
int **S7=new int* [n/2];
int **S8=new int* [n/2];
int **S9=new int* [n/2];
int **S10=new int* [n/2];
int **P1=new int* [n/2];
int **P2=new int* [n/2];
int **P3=new int* [n/2];
int **P4=new int* [n/2];
int **P5=new int* [n/2];
int **P6=new int* [n/2];
int **P7=new int* [n/2];
int **A11=new int* [n/2];
int **A22=new int* [n/2];
int **B11=new int* [n/2];
int **B22=new int* [n/2];
for(int i=0;i<n/2;i++){
S1[i]=new int[n/2];
S2[i]=new int[n/2];
S3[i]=new int[n/2];
S4[i]=new int[n/2];
S5[i]=new int[n/2];
S6[i]=new int[n/2];
S7[i]=new int[n/2];
S8[i]=new int[n/2];
S9[i]=new int[n/2];
S10[i]=new int[n/2];
P1[i]=new int[n/2];
P2[i]=new int[n/2];
P3[i]=new int[n/2];
P4[i]=new int[n/2];
P5[i]=new int[n/2];
P6[i]=new int[n/2];
P7[i]=new int[n/2];
A11[i]=new int[n/2];
B11[i]=new int[n/2];
A22[i]=new int[n/2];
B22[i]=new int[n/2];
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S1[i][m]=B[0+i][n/2+m]-B[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S2[i][m]=A[0+i][0+m]+A[i+0][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S3[i][m]=A[n/2+i][0+m]+A[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S4[i][m]=B[n/2+i][0+m]-B[0+i][0+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S5[i][m]=A[0+i][0+m]+A[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S6[i][m]=B[0+i][0+m]+B[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S7[i][m]=A[0+i][n/2+m]-A[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S8[i][m]=B[n/2+i][0+m]+B[n/2+i][n/2+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
S9[i][m]=A[0+i][0+m]-A[n/2+i][0+m];
}
}
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
A11[i][m]=A[0+i][0+m];
A22[i][m]=A[n/2+i][n/2+m];
B11[i][m]=B[0+i][0+m];
B22[i][m]=B[n/2+i][n/2+m];
}
}
P1=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A11,S1,n/2);
P2=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S2,B22,n/2);
P3=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S3,B11,n/2);
P4=SQUARE_MATRIX_MULTIPLY_RECURSIVE(A22,S4,n/2);
P5=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S5,S6,n/2);
P6=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S7,S8,n/2);
P7=SQUARE_MATRIX_MULTIPLY_RECURSIVE(S9,S10,n/2);
//如果是强行使用的是我们平时所使用的计算矩阵乘法的方法的话,那么所得到的
int ** conclusion=new int*[n];
for (int i=0;i<n;i++)
conclusion[i]=new int[n];
for (int i=0;i<n/2;i++){
for (int m=0;m<n/2;m++){
conclusion[0+i][0+m]=P5[i][m]+P4[i][m]-P2[i][m]+P6[i][m];
conclusion[0+i][n/2+m]=P1[i][m]+P2[i][m];
conclusion[n/2+i][0+m]=P3[i][m]+P4[i][m];
conclusion[n/2+i][n/2+m]=P1[i][m]+P5[i][m]-P3[i][m]-P7[i][m];
}
}
return conclusion;
}
}