主题:帮忙调试一下用分治法编一个矩阵相乘的程序
#include<stdio.h>
#include<math.h>
#define k 10
int add(int a[][k],int b[][k],int c[][k],int m){
int i,j;
for(i=0;i<m;i++)
for(i=0;j<m;j++)
c[i][j]=a[i][j]+b[i][j];
return 0;
}
int minus(int a[][k],int b[][k],int c[][k],int m){
int i,j;
for(i=0;i<m;i++)
for(i=0;j<m;j++)
c[i][j]=a[i][j]-b[i][j];
return 0;
}
int cheng(int a[][k],int b[][k],int c[][k],int m){
int i,j;
int a11[k][k],a12[k][k],a21[k][k],a22[k][k];
int b11[k][k],b12[k][k],b21[k][k],b22[k][k];
int c11[k][k],c12[k][k],c21[k][k],c22[k][k];
int m1[k][k],m2[k][k],m3[k][k],m4[k][k],m5[k][k],m6[k][k],m7[k][k];
int he1[k][k],he2[k][k],he3[k][k],he4[k][k],he5[k][k],he6[k][k];
int minus1[k][k], minus2[k][k], minus3[k][k], minus4[k][k];
int c111[k][k], c112[k][k],c221[k][k],c222[k][k];
if(m==1)
{
c[0][0]=a[0][0]*b[0][0];
}
else
{
for(i=0;i<m/2;i++)
for(j=0;j<m/2;j++)
{
a11[i][j]=a[i][j];
a12[i][j]=a[i][j+m/2];
a21[i][j]=a[i+m/2][j];
a22[i][j]=a[i+m/2][j+m/2];
b11[i][j]=b[i][j];
b12[i][j]=a[i][j+m/2];
b21[i][j]=a[i+m/2][j];
b22[i][j]=a[i+m/2][j+m/2];
}
add(a11,a12,he1,m/2);
add(a21,a22,he2,m/2);
add(a11,a22,he3,m/2);
add(b11,b22,he4,m/2);
add(b21,b22,he5,m/2);
add(b11,b12,he6,m/2);
minus(b12,b22,minus1,m/2);
minus(b21,b11,minus2,m/2);
minus(a12,a22,minus3,m/2);
minus(a11,a21,minus4,m/2);
cheng(a11,minus1,m1,m/2);
cheng(he1,b22,m2,m/2);
cheng(he2,b11,m3,m/2);
cheng(a22,minus2,m4,m/2);
cheng(he3,he4,m5,m/2);
cheng(minus3,he5,m6,m/2);
cheng(minus4,he6,m7,m/2);
add(m5,m4,c111,m/2);
minus(c111,m2,c112,m/2);
add(c112,m6,c11,m/2);
add(m1,m2,c12,m/2);
add(m3,m4,c21,m/2);
add(m5,m1,c221,m/2);
minus(c221,m3,c222,m/2);
minus(c222,m7,c22,m/2);
}
for(i=0;i<m/2;i++)
for(j=0;j<m/2;j++)
{
c[i][j]=a11[i][j];
c[i][j+m/2]=c12[i][j];
c[i+m/2][j]=c21[i][j];
c[i+m/2][j+m/2]=c22[i][j];
}
return 0;
}
int main()
{
int i,j,n;
int a[k][k],b[k][k];
int c[k][k];
scanf("%d",&n);
printf("a和b分别是%d阶矩阵",n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&b[i][j]);
printf("输出矩阵A:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("输出矩阵B:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",b[i][j]);
printf("\n");
}
cheng(a,b,c,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",c[i][j]);
printf("\n");
}
return 0;
}
在运行和编译时候都没有错,但在执行时就会被打断。请帮忙调试或看一下是哪出错了
谢谢啦
#include<math.h>
#define k 10
int add(int a[][k],int b[][k],int c[][k],int m){
int i,j;
for(i=0;i<m;i++)
for(i=0;j<m;j++)
c[i][j]=a[i][j]+b[i][j];
return 0;
}
int minus(int a[][k],int b[][k],int c[][k],int m){
int i,j;
for(i=0;i<m;i++)
for(i=0;j<m;j++)
c[i][j]=a[i][j]-b[i][j];
return 0;
}
int cheng(int a[][k],int b[][k],int c[][k],int m){
int i,j;
int a11[k][k],a12[k][k],a21[k][k],a22[k][k];
int b11[k][k],b12[k][k],b21[k][k],b22[k][k];
int c11[k][k],c12[k][k],c21[k][k],c22[k][k];
int m1[k][k],m2[k][k],m3[k][k],m4[k][k],m5[k][k],m6[k][k],m7[k][k];
int he1[k][k],he2[k][k],he3[k][k],he4[k][k],he5[k][k],he6[k][k];
int minus1[k][k], minus2[k][k], minus3[k][k], minus4[k][k];
int c111[k][k], c112[k][k],c221[k][k],c222[k][k];
if(m==1)
{
c[0][0]=a[0][0]*b[0][0];
}
else
{
for(i=0;i<m/2;i++)
for(j=0;j<m/2;j++)
{
a11[i][j]=a[i][j];
a12[i][j]=a[i][j+m/2];
a21[i][j]=a[i+m/2][j];
a22[i][j]=a[i+m/2][j+m/2];
b11[i][j]=b[i][j];
b12[i][j]=a[i][j+m/2];
b21[i][j]=a[i+m/2][j];
b22[i][j]=a[i+m/2][j+m/2];
}
add(a11,a12,he1,m/2);
add(a21,a22,he2,m/2);
add(a11,a22,he3,m/2);
add(b11,b22,he4,m/2);
add(b21,b22,he5,m/2);
add(b11,b12,he6,m/2);
minus(b12,b22,minus1,m/2);
minus(b21,b11,minus2,m/2);
minus(a12,a22,minus3,m/2);
minus(a11,a21,minus4,m/2);
cheng(a11,minus1,m1,m/2);
cheng(he1,b22,m2,m/2);
cheng(he2,b11,m3,m/2);
cheng(a22,minus2,m4,m/2);
cheng(he3,he4,m5,m/2);
cheng(minus3,he5,m6,m/2);
cheng(minus4,he6,m7,m/2);
add(m5,m4,c111,m/2);
minus(c111,m2,c112,m/2);
add(c112,m6,c11,m/2);
add(m1,m2,c12,m/2);
add(m3,m4,c21,m/2);
add(m5,m1,c221,m/2);
minus(c221,m3,c222,m/2);
minus(c222,m7,c22,m/2);
}
for(i=0;i<m/2;i++)
for(j=0;j<m/2;j++)
{
c[i][j]=a11[i][j];
c[i][j+m/2]=c12[i][j];
c[i+m/2][j]=c21[i][j];
c[i+m/2][j+m/2]=c22[i][j];
}
return 0;
}
int main()
{
int i,j,n;
int a[k][k],b[k][k];
int c[k][k];
scanf("%d",&n);
printf("a和b分别是%d阶矩阵",n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&b[i][j]);
printf("输出矩阵A:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
printf("输出矩阵B:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",b[i][j]);
printf("\n");
}
cheng(a,b,c,n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%d ",c[i][j]);
printf("\n");
}
return 0;
}
在运行和编译时候都没有错,但在执行时就会被打断。请帮忙调试或看一下是哪出错了
谢谢啦