1、设矩阵A、矩阵B和矩阵C为采用压缩存储方式存储的n阶对角矩阵,矩阵元素为整数类型,要求:
(1)编写实现矩阵加法运算C=A+B的函数
(2)编写实现矩阵乘法运算C=A*B的函数
(3)以下面的数据为测试例子,编写一个主程序进行测试
#include<stdio.h>
#include<malloc.h>
#include"head.h"
void main()
{
int i,n,m;
int *A,*B,*C;
printf("请输入矩阵数n:");
scanf("%d",&n);
m=n*(n+1)/2;
A=(int *)malloc(m,sizeof(int));
B=(int *)calloc(m,sizeof(int));
C=(int *)calloc(m,sizeof(int));
printf("输入矩阵A的压缩形式(下三角)\n");
for(i=0;i<m;i++)
{
scanf("%d",&A[i]);
}
printf("输入矩阵B的压缩形式(下三角)\n");
for(i=0;i<m;i++)
{
scanf("%d",&B[i]);
}
add(A,B,C,n);
print(A,B,C,n);
printf("/***------------------------------------***/\n\n");
//multiply(A,B,n);
multiply2(A,B,n);
}
void add(int *A,int *B,int *C,int n)
{
int i,s=n*(n+1)/2;
for(i=0;i<s;i++)
{
*(C+i)=*(A+i)+*(B+i);
}
}
void print(int *A,int* B,int* C,int n)
{
int i,j;
printf("A=\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>=j)
{
printf("%d\t",A[i*(i-1)/2+j-1]);
}
else
{
printf("%d\t",A[j*(j-1)/2+i-1]);
}
}
printf("\n\n");
}
printf("B=\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>=j)
{
printf("%d\t",B[i*(i-1)/2+j-1]);
}
else
{
printf("%d\t",B[j*(j-1)/2+i-1]);
}
}
printf("\n\n");
}
printf("C=\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>=j)
{
printf("%d\t",C[i*(i-1)/2+j-1]);
}
else
{
printf("%d\t",C[j*(j-1)/2+i-1]);
}
}
printf("\n\n");
}
}
void multiply(int *A,int *B,int n)
{
int i,j,o=0;
int k,l,p;
int t[80][80],s[80][80],r[80][80];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>=j)
{
t[i][j]=A[i*(i-1)/2+j-1];
}
else
{
t[i][j]=A[j*(j-1)/2+i-1];
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i>=j)
{
s[i][j]=B[i*(i-1)/2+j-1];
}
else
{
s[i][j]=B[j*(j-1)/2+i-1];
}
}
}
printf("D=\n");
for(l=1;l<=n;l++)
{
for(k=1;k<=n;k++)
{
for(p=1;p<=n;p++)
{
o=o+(t[l][p])*(s[p][k]);
}
r[l][k]=o;
o=0;
}
}
for(l=1;l<=n;l++)
{
for(p=1;p<=n;p++)
{
printf("%d\t",r[l][p]);
}
printf("\n\n");
}
}
int get(int i,int j)
{
if(i>=j)
return i*(i-1)/2+j-1;
else
return j*(j-1)/2+i-1;
}
int multiply2(int *A,int *B,int n)
{
int i,j,k,sum;
int C[80][80];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
sum=0;
for(k=1;k<=n;k++)
{
sum+=A[get(i,k)]*B[get(k,j)];
}
C[i][j]=sum;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d\t",C[i][j]);
}
printf("\n\n");
}
}