对称矩阵(数组)
时间: 1ms 内存:128M
描述:
已知A和B为两个n*n阶的对称矩阵,输入时,对称矩阵只输入下三角行元素,存入一维数组,设计一个程序,实现以下功能。
1、求对称矩阵A和B的和。
2、求对称矩阵A和B得到乘积。
输入:
输入包含两行,第一行为一个整数N,接下来为N个整数。N满足(N=n+n*(n-1)/2)n为矩阵的行数。
输出:
输出对称矩阵A和B的和与乘积,中间留有一个空行!
示例输入:
2
1 2 3
1 2 3
示例输出:
2 4
4 6
5 8
8 13
提示:
参考答案(内存最优[0]):
#include<stdio.h>
int main()
{
int a[100][100],b[100][100];
int n,m,temp,i,j,k,l;
scanf("%d",&n);
for (i=0;i<n;i++)
{
for (j=0;j<=i;j++)
{
scanf("%d",&a[i][j]);
a[j][i]=a[i][j];
}
}
for (i=0;i<n;i++)
{
for (j=0;j<=i;j++)
{
scanf("%d",&b[i][j]);
b[j][i]=b[i][j];
}
}
for (i=0;i<n;i++)
{
for (j=0;j<n-1;j++)
{
printf("%d ",a[i][j]+b[i][j]);
}
printf("%d\n",a[i][j]+b[i][j]);
}
for (k=0;k<n;k++)
{
for (l=0;l<n;l++)
{
temp=0;
for (j=0;j<n;j++)
{
temp=temp+a[k][j]*b[j][l];
}
if (l==n-1)
printf("%d\n",temp);
else
printf("%d ",temp);
}
}
}
参考答案(时间最优[0]):
#include <stdio.h>
#include <string.h>
void print(int *a,int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(i>=j)printf(j!=n-1?"%d ":"%d\n",a[i*(i+1)/2+j]);
else printf(j!=n-1?"%d ":"%d\n",a[j*(j+1)/2+i]);
}
}
}
int main()
{
int N;
scanf("%d",&N);
int n=N*(N+1)/2;
int a[n],b[n],add[n],s[n];
for(int i=0; i<n; i++)
scanf("%d",a+i);
for(int i=0; i<n; i++)
scanf("%d",b+i);
for(int i=0; i<n; i++)
add[i]=a[i]+b[i];
memset(s,0,sizeof(s));
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
int num=0;
for(int k=0; k<N; k++)
{
int aa,bb;
if(i>=k)aa=a[i*(i+1)/2+k];
else aa=a[k*(k+1)/2+i];
if(k>=j)bb=b[k*(k+1)/2+j];
else bb=b[j*(j+1)/2+k];
num+=aa*bb;
}
if(i>=j)s[i*(i+1)/2+j]=num;
else s[j*(j+1)/2+i]=num;
}
}
print(add,N);
printf("\n");
print(s,N);
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。