Mọi người giúp mình sửa bài này với, cái này là bài tập môn phân tích và thiết kế thuật toán của mình, phương pháp này để giảm chi phí khi dùng nhân ma trận kích thước lớn, mọi người có thể tham khảo pp Stressen dưới đây hoặc google thêm:
còn đây là code:
#include<stdio.h>
#include<conio.h>
void input(int*&a,int n);
void print(int* a,int n);
void split(int n,int* x,int*&a,int*&b,int*&c,int*&d);
void sum(int n,int* a,int* b,int*&c);
void sub(int n,int* a,int* b,int*&c);
void mulStressen(int* a,int* b,int*&c);
void join(int n,int*&x,int* a,int* b,int* c,int* d);
void maxtrixProduct(int* a,int* b,int*&c,int n);
int main(){
int* a;
int* b;
int* c;
int n;
input(a,n);
input(b,n);
maxtrixProduct(a,b,c,n);
print(c,n);
getch();
return 0;
}
void input(int*&a,int n){
int i,j;
printf("\n n= ");
scanf("%d",&n);
a=new int[n*n];
for (i=0;i<n;i++)
for ( j=0;j<n;j++){
printf("Nhap a[%d][%d]: ",i,j);
scanf("%d",&a[i*n+j]);
}
}
void print(int* a,int n){
int i;
for( i=0;i<n;i++){
// printf("\n");
for(int j=0;j<n;j++){
printf(" %d",a[i*n+j]);
}
printf("\n");
}
}
void split(int n,int* x,int*&a,int*&b,int*&c,int*&d){
int m=n/2;
int i,j;
for(i=0;i<m;i++)
for(j=0;j<m;j++) a[k++]=x[i*n+j];
for(i=0;i<m;i++)
for(j=m;j<n;j++) b[k++]=x[i*n+j];
for(i=m;i<n;i++)
for(j=0;j<m;j++) c[k++]=x[i*n+j];
for(i=m;i<n;i++)
for(j=m;j<n;j++) d[k++]=x[i*n+j];
}
void sum(int n,int* a,int* b,int*&c){
int i;
for( i=0;i<n;i++)
for( j=0;j<n;j++)
c[i*n+j]=a[i*n+j]+b[i*n+j];
}
void sub(int n,int* a,int* b,int*&c){
int i;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c[i*n+j]=a[i*n+j]-b[i*n+j];
}
void mulStressen(int* a,int* b,int*&c){
int m1,m2,m3,m4,m5,m6,m7;
m1=(a[0*2+1]-a[1*2+1])*(b[1*2+0]+b[1*2+1]);
m2=(a[0*2+0]+a[1*2+1])*(b[0*2+0]+b[1*2+1]);
m3=(a[0*2+0]-a[1*2+0])*(b[0*2+0]+b[0*2+1]);
m4=(a[0*2+0]+a[0*2+1])*b[1*2+1];
m5=a[0*2+0]*(b[0*2+1]-b[1*2+1]);
m6=a[1*2+1]*(b[1*2+0]-b[0*2+0]);
m7=(a[1*2+0]+a[1*2+1])*b[0*2+0];
c[0*2+0]=m1+m2-m4+m6;
c[0*2+1]=m4+m5;
c[1*2+0]=m6+m7;
c[1*2+1]=m2-m3+m5-m7;
}
void join(int n,int*&x,int* a,int* b,int* c,int* d){
int m=n/2;
int i,j;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
x[i*n+j]=a[k++];
for(i=0;i<m;i++)
for(j=m;j<n;j++)
x[i*n+j]=b[k++];
for(i=m;i<n;i++)
for(j=0;j<m;j++)
x[i*n+j]=c[k++];
for(i=m;i<n;i++)
for(j=m;j<n;j++)
x[i*n+j]=d[k++];
}
void maxtrixProduct(int* a,int* b,int*&c,int n){
if(n==2)mulStressen(a,b,c);
else{
int* d1=(int*) malloc(sizeof(int)*n*n);
int* d2=(int*) malloc(sizeof(int)*n*n);
int* a00=(int*) malloc(sizeof(int)*n*n);
int* a01=(int*) malloc(sizeof(int)*n*n);
int* a10=(int*) malloc(sizeof(int)*n*n);
int* a11=(int*) malloc(sizeof(int)*n*n);
int* b00=(int*) malloc(sizeof(int)*n*n);
int* b01=(int*) malloc(sizeof(int)*n*n);
int* b10=(int*) malloc(sizeof(int)*n*n);
int* b11=(int*) malloc(sizeof(int)*n*n);
int* c00=(int*) malloc(sizeof(int)*n*n);
int* c01=(int*) malloc(sizeof(int)*n*n);
int* c10=(int*) malloc(sizeof(int)*n*n);
int* c11=(int*) malloc(sizeof(int)*n*n);
split(n,a,a00,a01,a10,a11);
split(n,b,b00,b01,b10,b11);
split(n,c,c00,c01,c10,c11);
maxtrixProduct(a00,b00,d1,n/2);
maxtrixProduct(a01,b10,d2,n/2);
sum(n/2,d1,d2,c00);
maxtrixProduct(a00,b01,d1,n/2);
maxtrixProduct(a01,b11,d2,n/2);
sum(n/2,d1,d2,c01);
maxtrixProduct(a10,b00,d1,n/2);
maxtrixProduct(a11,b10,d2,n/2);
sum(n/2,d1,d2,c10);
maxtrixProduct(a10,b01,d1,n/2);
maxtrixProduct(a11,b11,d2,n/2);
sum(n/2,d1,d2,c11);
join(n,a,c00,c01,c10,c11);
}
}
Mọi người dùng c giúp mình nha, chỗ nào mình nhầm c++ thì sửa lại giúp với nha.