#include
void gzcf(int a[100][100],int b[100][100],int c[100][100],int s1,int s2,int n1,int n2,int s3,int s4,int n3,int n4,int m,int s5,int n5,int o,int q);
void jzcfaa(int s[100][100],int l[100][100],int m1,int m2,int m3,int m4,int h1,int h2,int h3,int h4,int q);
void jzcfbb(int h[100][100],int l[100][100],int f1,int f2,int r1,int r2,int h11,int h22,int n11,int n22,int qq);
int main()
{
int a[100][100],b[100][100],c[100][100];
int s1=1,s2=1,n1,n2,s3=1,s4=1,n3,n4,m=1,s5,n5,o,q;
int i,j,n;
printf("请输入第一个,第二个矩阵的行和列,它们的行和列相同\n");
scanf("%d",&n);
printf("请输入两个矩阵元素\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
printf("\n");
}
printf("\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&b[i][j]);
printf("\n");
}
printf("\n");
n1=n;n2=n;n3=n;n4=n;n5=n;s5=n;o=n;q=n;
gzcf(a,b,c,s1,s2,n1,n2,s3,s4,n3,n4,m,s5,n5,o,q);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d ",c[i][j]);
printf("\n");
}
}
void gzcf(int a[100][100],int b[100][100],int c[100][100],int s1,int s2,int n1,int n2,int s3,int s4,int n3,int n4,int m,int s5,int n5,int o,int q)
{
int mid1,mid2,mid3,mid4,mid5,mid6;
int i,j;
int k,s;
int s11[100][100],s22[100][100],s33[100][100],s44[100][100],s55[100][100],s66[100][100],s77[100][100],s88[100][100],s99[100][100],s1010[100][100];
int c1[100][100],c2[100][100],c3[100][100],c4[100][100],c5[100][100],c6[100][100],c7[100][100];
if(q==1)
{
c[1][1]=a[s1][s2]*b[s3][s4];
}
else
{
o=(1+o)/2;
q=(q+1)/2;
mid1=(s1+n1)/2;
mid2=(s2+n2)/2;
mid3=(s3+n3)/2;
mid4=(s4+n4)/2;
mid5=(m+s5)/2;
mid6=(m+n5)/2;
jzcfbb(s11,b,s3,mid4+1,mid3,n4,mid3+1,mid4+1,n3,n4,q);
jzcfaa(s22,a,s1,s2,mid1,mid2,s1,mid2+1,mid1,n2,q);
jzcfaa(s33,a,mid1+1,s2,n1,mid2,mid1+1,mid2+1,n1,n2,q);
jzcfbb(s44,b,mid3+1,s4,n3,mid4,s3,s4,mid3,mid4,q);
jzcfaa(s55,a,s1,s2,mid1,mid2,mid1+1,mid2+1,n1,n2,q);
jzcfaa(s66,b,s3,s4,mid3,mid4,mid3+1,mid4+1,n3,n4,q);
jzcfbb(s77,a,s1,mid2+1,mid1,n2,mid1+1,mid2+1,n1,n2,q); //最后一步时S只有一个数
jzcfaa(s88,b,mid3+1,s4,n3,mid4,mid3+1,mid4+1,n3,n4,q); //为什么当N=2时会正确,因为 一递归就返回一个值,没有进行2次递归
jzcfbb(s99,a,s1,s2,mid1,mid2,mid1+1,s2,n1,mid2,q);
jzcfaa(s1010,b,s3,s4,mid3,mid4,s3,mid4+1,mid3,n4,q);
gzcf(a,s11,c1,s1,s2,mid1,mid2,1,1,q,q,m,mid5,mid6,o,q);
//s11存在四个值
gzcf(s22,b,c2,1,1,q,q,mid3+1,mid4+1,n3,n4,m,mid5,mid6,o,q);
gzcf(s33,b,c3,1,1,q,q,s3,s4,mid3,mid4,m,mid5,mid6,o,q);
gzcf(a,s44,c4,mid1+1,mid2+1,n1,n2,1,1,q,q,m,mid5,mid6,o,q);
gzcf(s55,s66,c5,1,1,q,q,1,1,q,q,m,mid5,mid6,o,q); //由结果可知当Q=2时会返回正确结果
gzcf(s77,s88,c6,1,1,q,q,1,1,q,q,m,mid5,mid6,o,q);
gzcf(s99,s1010,c7,1,1,q,q,1,1,q,q,m,mid5,mid6,o,q);
k=1;
for(i=1;i<=mid5;i++)
{
s=1;
for(j=1;j<=mid6;j++)
{
c[i][j]=c5[k][s]+c4[k][s]-c2[k][s]+c6[k][s];
s++;
}
k++;
}
k=1;
for(i=m;i<=mid5;i++)
{
s=1;
for(j=mid6+1;j<=n5;j++)
{
c[i][j]=c1[k][s]+c2[k][s];
s++;
}
k++;
}
k=1;
for(i=mid5+1;i<=s5;i++)
{
s=1;
for(j=m;j<=mid6;j++)
{
c[i][j]=c3[k][s]+c4[k][s];
s++;
}
k++;
}
k=1;
for(i=mid5+1;i<=s5;i++)
{
s=1;
for(j=mid6+1;j<=n5;j++)
{
c[i][j]=c5[k][s]+c1[k][s]-c3[k][s]-c7[k][s]; //每次运算是S=1
s++;
}
k++;
}
}
void jzcfaa(int s[100][100],int l[100][100],int m1,int m2,int m3,int m4,int h1,int h2,int h3,int h4,int q)
{
int i,j;
int w,p;
w=m2;p=h2;
for(i=1;i<=q;i++)
{
m2=w;h2=p;
for(j=1;j<=q;j++)
{
s[i][j]=l[m1][m2]+l[h1][h2];
m2++;
h2++;
}
m1++;
h1++;
}
}
void jzcfbb(int h[100][100],int l[100][100],int f1,int f2,int r1,int r2,int h11,int h22,int n11,int n22,int qq)
{
int i,j;
int w,s;
w=f2;s=h22;
for(i=1;i<=qq;i++)
{
f2=w;h22=s;
for(j=1;j<=qq;j++)
{
h[i][j]=l[f1][f2]-l[h11][h22];
f2++;
h22++;
}
f1++;
h11++;
}
}
}