69,335
社区成员
发帖
与我相关
我的任务
分享
printf("请输入阶数n:\n");
scanf("%d",&n);
int **c=(int**)malloc(n*sizeof(int*));//动态分配二维数组
if (!c)
exit(0);
for(i=0;i<n;i++)
{
c[i]=(int*)malloc(sizeof(int)*n);
if (!c[i])
exit(0);
}
#include <stdio.h>
#include <stdlib.h>
void show(int v[],int n)//将压缩矩阵转变为原矩阵输出
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i>=j)//比较行和列下标
printf("%5d",v[i*(i+1)/2+j]);
else
printf("%5d",v[j*(j+1)/2+i]);
}
printf("\n");
}
}
//void multiply(int va[],int vb[],int c[][n],int n) //这儿的c是二重指针,因此直接用**c即可
void multiply(int va[],int vb[],int **c,int n)
{
int i,j,k,s,op1,op2;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
s=0;
for(k=0;k<n;k++)
{
if(i>=k)//比较行和列的下标,行不变,列改变 k相当于列下标
{
op1=va[i*(i+1)/2+k];
}
else
{
op1=va[k*(k+1)/2+i];
}
if(k>=j)//比较行和列的下标,列不变,行改变 k相当于行下标
{
op2=vb[k*(k+1)/2+j];
}
else
{
op2=vb[j*(j+1)/2+k];
}
s+=op1*op2;
}
c[i][j]=s;
}
}
for(i=0;i<n;i++)//打印二维数组
{
for(j=0;j<n;j++)
{
printf("%5d",c[i][j]);
}
printf("\n");
}
return;
}
void Destroy(int **a,int n)//二维动态数组销毁
{
int i;
for(i=0;i<n;i++)
{
free(a[i]);
}
free(a); //最后也要把a释放了
}
int main()
{
int n,k,i,j;
int *a,*b;
printf("请输入阶数n:\n");
scanf("%d",&n);
int **c=(int**)malloc(n*sizeof(int*));//动态分配二维数组
for(i=0;i<n;i++)
{
c[i]=(int*)malloc(sizeof(int)*n);
}
k=n*(n+1)/2; //k作为一维数组来存储n阶对称矩阵一维数组要求的元素个数
a=(int*)malloc(sizeof(int)*k);//动态分配一维数组a
b=(int*)malloc(sizeof(int)*k);//动态分配一维数组b
printf("生成矩阵A 请输入%d个压缩矩阵中的数:\n",n*(n+1)/2);
for(i=0;i<k;i++)
{
scanf("%d",&a[i]);//输入压缩矩阵元素
}
printf("矩阵A为 :\n");
show(a,n);//将压缩矩阵转变为原矩阵输出
printf("生成矩阵B 请输入%d个压缩矩阵中的数:\n",n*(n+1)/2);
for(i=0;i<k;i++)
{
scanf("%d",&b[i]);////输入压缩矩阵元素
}
printf("矩阵B为 :\n");
show(b,n);//将压缩矩阵转变为原矩阵输出
printf("A*B=:\n");
multiply(a,b,c,n);//返回二维数组的地址
Destroy(c,n);//销毁二维数组
return 0;
}