YTU 3020: 对称矩阵(数组)

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\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;
}

应该有更好的算法,到最后还是没有想出来,/(ㄒoㄒ)/~~

你可能感兴趣的:(YTU 3020: 对称矩阵(数组))