对称矩阵(数组)

时间: 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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。