【数据结构】求两个对称矩阵之和与乘积

实验题目:

  •    求两个对称矩阵之和与乘积
    
  • 实验目的:
  •    掌握对称矩阵的压缩存储方法及相关算法设计
    
  • 实验内容:
  •    已知A和B为两个nxn阶的对称矩阵,输入时,对称矩阵只输入下三角形元素,
    
  • 存入一维数组。设计程序,完成如下功能:
  • 1、求对称矩阵A和B的和。
  • 2、求对称矩阵A和B的乘积。
#include <iostream>
using namespace std;

#define N 4
#define M 10
/* ----------------------输入矩阵a,b   n表示矩阵所含的行数------------- */
static void input(int n, int a[], int b[])
{
    for(int k=0;k<n*(n+1)/2;k++){
        cin>>a[k];
    }
    for(int k=0;k<n*(n+1)/2;k++){
        cin>>b[k];
    }
}
/*-----------------------返回压缩存储a中a[i][j]的值-----------------------*/
/**
*   算法思路
*       对称矩阵M的第i行和第j列的元素的数据存储在一维数组a中的位置k的计算公式:
*   1、当i大于或等于j时,k = (i * (i + 1)) / 2 + j (下三角)
*   2、当i小于j时,k = (j * (j + 1)) / 2 + i (上三角)
*
*/
static int value(int a[], int i,int j)
{
    if (i>=j)
        return a[i*(i+1)/2+j];
    else
        return a[j*(j+1)/2+i];
}
/*-----------------------求压缩存储a和b的和-----------------------*/
static void madd(int a[],int b[],int c[][N])
{
    for (int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            c[i][j]=value(a,i,j)+value(b,i,j);
        }
    }
}
/*-----------------------求压缩存储a和b的乘积-----------------------*/
static void mult(int a[],int b[],int c[][N])
{
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            int sum = 0;
            for (int k=0;k<N;k++){
                sum=sum+value(a,i,k)*value(b,k,j);
            }
            c[i][j]=sum;
        }
    }
}
/*-----------------------输出压缩存储a-----------------------*/
static void disp1(int a[])
{
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            cout<<value(a,i,j)<<" ";
        }
        cout<<endl;
    }
}
/*-----------------------输出对称矩阵c-----------------------*/
static void disp2(int c[][N])
{
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            cout<<c[i][j]<<" ";
        }
        cout<<endl;
    }
}
/* 主函数 */
int main()
{
    int n;
    cin>>n;
    int a[n*(n+1)/2],b[n*(n+1)/2];
    int c1[N][N],c2[N][N];
    input(n,a,b);
    cout<<"两个矩阵之和"<<endl;
    madd(a,b,c1);
    disp2(c1);
    cout<<"两个矩阵之积"<<endl;
    mult(a,b,c2);
    disp2(c2);
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lydia.na

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值