Problem D: 强悍的矩阵运算来了

Posted 一本故事i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Problem D: 强悍的矩阵运算来了相关的知识,希望对你有一定的参考价值。

Problem D: 强悍的矩阵运算来了

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 1817  Solved: 1160
[Submit][Status][Web Board]

Description

定义一个Matrix类,用于存储一个矩阵。重载其+、*运算符,分别用于计算两个矩阵的和、乘积;重载其<<和>>运算符,用于输出和输入一个矩阵。要求当两个矩阵不能进行加法或乘法运算时,应该输出Error。

 

Input

输入第1行N>0,表示有N组测试用例,共2N个矩阵。

每组测试用例包括2个矩阵。每个矩阵首先输入行数、列数,之后是该矩阵的所有元素。

 

Output

每个测试用例产生一组输出。具体格式见样例。注意:当不能进行加法或乘法运算时,应输出Error。

 

Sample Input

3
2 2
1 1
1 1
2 2
2 2
2 2
1 1
1
1 2
2 2
1 1
1
2 2
2 2
2 2

  

Sample Output

Case 1:
3 3
3 3

4 4
4 4
Case 2:
Error

2 2
Case 3:
Error

Error

  

HINT

 

Append Code

append.cc
int main()
{
    int cases, i;
    cin>>cases;
    for (i = 0; i < cases; i++)
    {
        Matrix A, B, C, D;
        cin>>A>>B;
        C = A + B;
        D = A * B;
        cout<<"Case "<<i + 1<<":"<<endl;
        cout<<C<<endl;
        cout<<D;
    }
    return 0;
}

  

#include <iostream>
using namespace std;
class Matrix
{
public :
    int rec[100][100];
    int hang, lie;
    string error;
    Matrix():hang(0), lie(0), error("No"){}
    Matrix operator+(const Matrix &p)
    {
        Matrix temp;
        temp.hang=hang; temp.lie=lie;
        if(hang!=p.hang||lie!=p.lie)
            temp.error="Yes";
        else
            temp.error="No";
            int i, j;
            for(i=0; i<hang; i++)
            {
                for(j=0; j<lie; j++)
                    temp.rec[i][j]=rec[i][j]+p.rec[i][j];
            }
        return temp;
    }
    //   1 2 3     1 2
    //   1 2 3     1 2
    //             1 2
    Matrix operator*(const Matrix &p)
    {
        Matrix temp;
        temp.hang=hang; temp.lie=p.lie;
        if(lie!=p.hang)
            temp.error="Yes";
        else
            temp.error="No";
            int i, j, k;
        for(i=0; i<hang; i++)//第一个矩阵行不变
        {
            for(j=0; j<p.lie; j++)//第二个矩阵列不变
            {
                int sum=0;
               //第一个矩阵的列等于第二个矩阵的行
                for(k=0; k<p.hang; k++)
                {
                    sum+=rec[i][k]*p.rec[k][j];
                }
                temp.rec[i][j]=sum;
            }
        }
        return temp;

    }
    friend istream &operator>>(istream &is, Matrix &p)
    {
        int x, y; cin>>x>>y; p.hang=x; p.lie=y;
        for(int i=0; i<p.hang; i++)
        {
            for(int j=0; j<p.lie; j++)
            {
                is>>p.rec[i][j];
            }
        }
        return is;
    }
    friend ostream &operator<<(ostream &os, Matrix &p)
    {
        if(p.error=="Yes")
        {
           os<<"Error"<<endl;
           return  os;
        }

            for(int i=0; i<p.hang; i++)
            {
                for(int j=0; j<p.lie; j++)
                {
                    if(j==p.lie-1)
                        os<<p.rec[i][j]<<endl;
                    else
                        os<<p.rec[i][j]<<" ";
                }
            }
            return os;

    }

};
int main()
{
    int cases, i;
    cin>>cases;
    for (i = 0; i < cases; i++)
    {
        Matrix A, B, C, D;
        cin>>A>>B;
        C = A + B;
        D = A * B;
        cout<<"Case "<<i + 1<<":"<<endl;
        cout<<C<<endl;
        cout<<D;
    }
    return 0;
}

  

 

以上是关于Problem D: 强悍的矩阵运算来了的主要内容,如果未能解决你的问题,请参考以下文章

cf 模拟

Problem D: 零起点学算法94——输出矩阵

Problem D: 零起点学算法95——弓型矩阵

如何在 python 中并行化以下代码片段?

Problem D: 整型数组运算符重载

重载运算符中的分段错误>>