3020: 对称矩阵(数组)
时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 2
题目描述
已知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
迷失在幽谷中的鸟儿,独自飞翔在这偌大的天地间,却不知自己该飞往何方……
#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 ",a[i*(i+1)/2+j]); else printf(j!=n-1?"%d ":"%d ",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(" "); print(s,N); return 0; }