首页 > 试题广场 >

计算两个矩阵的乘积

[编程题]计算两个矩阵的乘积
  • 热度指数:11228 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
计算两个矩阵的乘积,第一个是2*3,第二个是3*2

输入描述:
输入为两个矩阵,其中一个为2*3的矩阵,另一个为3*2的矩阵


输出描述:
一个2*2的矩阵(每一个数字后都跟一个空格)
示例1

输入

1 2 3
3 4 5
6 7
8 9
10 11

输出

52 58
100 112
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int a1 = 0, b1 = 0, c1 = 0;
    int a2 = 0, b2 = 0, c2 = 0;
    int x1 = 0, x2 = 0;
    int y1 = 0, y2 = 0;
    int z1 = 0, z2 = 0;
    int ret1 = 0, ret2 = 0, ret3 = 0, ret4 = 0;
    scanf("%d %d %d",&a1,&b1,&c1);
    scanf("%d %d %d",&a2,&b2,&c2);
    scanf("%d %d",&x1,&x2);
    scanf("%d %d",&y1,&y2);
    scanf("%d %d",&z1,&z2);
    ret1 = a1*x1+b1*y1+c1*z1;
    ret2 = a1*x2+b1*y2+c1*z2;
    ret3 = a2*x1+b2*y1+c2*z1;
    ret4 = a2*x2+b2*y2+c2*z2;
    
    printf("%d %d \n",ret1,ret2);
    printf("%d %d \n",ret3,ret4);
    
    
    return 0;
}

发表于 2021-01-27 14:55:14 回复(0)
#include<stdio.h>
int main()
{
    int a[2][3],b[3][2],c[2][2]={0},i,j,k;
    //输入两个数组
    for(i=0;i<2;i++)
        for(j=0;j<3;j++)
            scanf("%d",&a[i][j]);    
    for(i=0;i<3;i++)
        for(j=0;j<2;j++)
            scanf("%d",&b[i][j]);
    //两个数组相乘
          for(i=0; i<2; i++)//ik作为数组a//kj作为数组b//ij作为数组c
            for(j=0; j<2; j++)
                for(k=0; k<3; k++)
                    c[i][j]+=a[i][k]*b[k][j];
    //输出
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
            printf("%d ",c[i][j]);
        printf("\n");
    }
}

发表于 2020-04-08 15:52:54 回复(0)
res[i][j]=a[i][k]*b[k][j];
发表于 2020-03-20 12:11:35 回复(1)
Java 解法
import java.util.Scanner;

public class Main {
    public static final int n=2;
    public static final int m=3;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[][] matrix = new int[n][m];
        int[][] matrix1 = new int[m][n];
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < m; j++) 
                matrix[i][j]=scanner.nextInt();
            
        for (int i = 0; i < m; i++) 
            for (int j = 0; j < n; j++) 
                matrix1[i][j]=scanner.nextInt();
            
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int sum=0;
                for (int k = 0; k < m; k++) sum+=matrix[i][k]*matrix1[k][j];
                System.out.print(sum+" ");
            }
            System.out.println();
        }
    }
}


发表于 2020-03-14 18:53:21 回复(0)
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<cmath>

using namespace std;

int main() {

	int a[2][3], b[3][2], c[2][2] = {0};
	for (int i = 0; i < 2;i++) {
		for (int j = 0; j < 3;j++) {
			cin >> a[i][j];
		}
	}

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 2; j++) {
			cin >> b[i][j];
		}
	}

	for (int i = 0; i < 2; i++) {
		for (int j = 0; j < 2; j++) {
			for (int k = 0; k < 3;k++) {
				c[i][j] += a[i][k] * b[k][j];
			}
			cout << c[i][j] << " ";
		}
		cout << endl;
	}



	return 0;
}

发表于 2020-02-13 20:51:16 回复(0)
while True:
    try:
        arr1=[]
        arr2=[]
        for i in range(2):
            arr1.append(list(map(int,input().strip().split(' '))))
        for i in range(3):
            arr2.append(list(map(int,input().strip().split(' '))))
        result=[]
        for i in range(2):
            result.append([0]*2)
        for i in range(2):
            for j in range(2):
                sum1=0
                for k in range(3):
                    sum1+=arr1[i][k]*arr2[k][j]
                result[i][j]=str(sum1)
        for i in result:
            print(' '.join(i)+' ')

    except:
        break

坑在于每个数字后面都要空格

编辑于 2019-08-07 21:30:24 回复(0)
注意每个数字后面跟一个空格
#include <stdio.h>

int main()
{
    int a[2][3], b[3][2], c[2][2];
    while(scanf("%d", &a[0][0])!=EOF)
    {//数组实在太小,我都不想写循环
        scanf("%d %d", &a[0][1], &a[0][2]);
        scanf("%d %d %d", &a[1][0], &a[1][1], &a[1][2]);
        scanf("%d %d", &b[0][0], &b[0][1]);
        scanf("%d %d", &b[1][0], &b[1][1]);
        scanf("%d %d", &b[2][0], &b[2][1]);
        for(int i=0; i<2; i++){//算了,向循环低头
            for(int j=0; j<2; j++){
                c[i][j]=0;
            }
        }
        for(int i=0; i<2; i++){
            for(int j=0; j<2; j++){
                for(int k=0; k<3; k++)
                {
                    c[i][j]+=a[i][k]*b[k][j];
                }
            }
        }
        //就不用循环
        printf("%d %d \n%d %d \n", c[0][0], c[0][1], c[1][0], c[1][1]);
    }
    return 0;//完事了
}

发表于 2018-02-08 13:17:05 回复(4)
#include<stdio.h>
int main (){//the shorter,the better.
    int m[12];
    for (;~scanf("%d%d%d%d%d%d%d%d%d%d%d%d",&m[0],&m[1],&m[2],&m[3],&m[4],&m[5],&m[6],&m[7],&m[8],&m[9],&m[10],&m[11])&&printf("%d %d\n%d %d\n",m[0]*m[6]+m[1]*m[8]+m[2]*m[10],m[0]*m[7]+m[1]*m[9]+m[2]*m[11],m[3]*m[6]+m[4]*m[8]+m[5]*m[10],m[3]*m[7]+m[4]*m[9]+m[5]*m[11]););
}

编辑于 2018-01-13 12:49:52 回复(1)
#include<stdio.h>
int main(){
    int a[2][3],b[3][2];
        scanf("%d%d%d%d%d%d",&a[0][0],&a[0][1],&a[0][2],&a[1][0],&a[1][1],&a[1][2]);
        scanf("%d%d%d%d%d%d",&b[0][0],&b[0][1],&b[1][0],&b[1][1],&b[2][0],&b[2][1]);
        printf("%d ",b[0][0]*a[0][0]+b[1][0]*a[0][1]+b[2][0]*a[0][2]);
        printf("%d \n",b[0][1]*a[0][0]+b[1][1]*a[0][1]+b[2][1]*a[0][2]);
        printf("%d ",b[0][0]*a[1][0]+b[1][0]*a[1][1]+b[2][0]*a[1][2]);
        printf("%d \n",b[0][1]*a[1][0]+b[1][1]*a[1][1]+b[2][1]*a[1][2]);
        return 0;
}

发表于 2018-02-12 20:55:47 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        final int I = 2;
        final int J = 3;
        Scanner sc = new Scanner(System.in);
        int[][] a = new int[I][J];
        int[][] b = new int[J][I];
        int[][] c = new int[I][I];
        while(sc.hasNext()){
            for(int i=0;i<I;i++){
                for(int j=0;j<J;j++){
                    a[i][j] = sc.nextInt();
                }
            }
            for(int i=0;i<J;i++){
                for(int j=0;j<I;j++){
                    b[i][j] = sc.nextInt();
                }
            }
            for(int i=0;i<I;i++){
                for(int j=0;j<I;j++){
                    c[i][j]=0;
                    for(int k=0;k < J;k++ ){
                        c[i][j]=a[i][k]*b[k][j]+c[i][j];
                    }
                }
            }
            for(int i=0;i<I;i++){
                for(int j=0;j<I;j++){
                    System.out.print(c[i][j]+" ");
                    if(j==I-1){
                        System.out.println("");
                    }
                }
            }
        }
    }
}
本代码并没有写死,测试了一下,修改final修饰的值可使用于其他n*m矩阵,就是循环多了点,哈哈,没办法,想到改良版再来看看先,思路通用的,其他语言也可以实现
发表于 2018-08-03 04:55:39 回复(0)
//太久没做矩阵乘法了,所以算法写的很不熟
#include<iostream>
using namespace std;
int main() {
	int a[2][3], b[3][2], c[2][2] = { 0 };
	for (int i = 0; i<2; i++)
		for (int j = 0; j<3; j++)
			cin >> a[i][j];
	for (int i = 0; i<3; i++)
		for (int j = 0; j<2; j++)
			cin >> b[i][j];
	for (int i = 0; i<2; i++)
		for (int j = 0; j<2; j++)
			for (int k = 0; k<3; k++)
				c[i][j] += a[i][k] * b[k][j];
	for(int i=0;i<2;i++){
        for(int j=0;j<2;j++)
            cout<<c[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

发表于 2020-01-13 20:56:04 回复(1)
#include<bits/stdc++.h>
int main(){
    int a[2][3],b[3][2],c[2][2]={0};
    while(scanf("%d %d %d %d %d %d",&a[0][0],&a[0][1],&a[0][2],&a[1][0],&a[1][1],&a[1][2])!=EOF){
        for(int i=0;i<3;i++)
            for(int j=0;j<2;j++)
                scanf("%d",&b[i][j]);
        for(int i=0;i<3;i++){
            c[0][0]+=a[0][i]*b[i][0];
            c[0][1]+=a[0][i]*b[i][1];
            c[1][0]+=a[1][i]*b[i][0];
            c[1][1]+=a[1][i]*b[i][1];
        }
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++)
                printf("%d ",c[i][j]);
            printf("\n");
        }
    }
}
发表于 2019-03-19 10:20:18 回复(2)
#include <iostream>
using namespace std;
const int N=10;
int a[N][N];
int b[N][N];
int main()
{
   for(int i=1;i<=2;i++)
   {
     for(int j=1;j<=3;j++)
     {
         cin>>a[i][j];
     }
   }
   for(int i=1;i<=3;i++)
   {
       for(int j=1;j<=2;j++)
       {
        cin>>b[i][j];
       }
   }
      int ans1=a[1][1]*b[1][1]+a[1][2]*b[2][1]+a[1][3]*b[3][1];
      int ans2=a[1][1]*b[1][2]+a[1][2]*b[2][2]+a[1][3]*b[3][2];
      int ans3=a[2][1]*b[1][1]+a[2][2]*b[2][1]+a[2][3]*b[3][1];
      int ans4=a[2][1]*b[1][2]+a[2][2]*b[2][2]+a[2][3]*b[3][2];
      cout<<ans1<<" "<<ans2<<endl;
      cout<<ans3<<" "<<ans4<<endl;
     return 0;
}
发表于 2023-06-06 20:53:01 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

struct Matrix {
	int matrix[3][3];
	int row, col;								//行、列 
	Matrix(int r, int c): row(r), col(c) {}		//构造函数 
};

Matrix Multiply(Matrix x, Matrix y);
void PrintMatrix(Matrix x);

//矩阵乘积 
int main() {
	Matrix x(2, 3);
	Matrix y(3, 2);
	
	//输入x矩阵 
	for (int i = 0; i < x.row; i++) {
		for (int j = 0; j < x.col; j++) {
			scanf("%d", &x.matrix[i][j]); 
//			cin >> x.matrix[i][j] ;
		}
	}
	
	//输入y矩阵 
	for (int i = 0; i < y.row; i++) {
		for (int j = 0; j < y.col; j++) {
			scanf("%d", &y.matrix[i][j]); 
//			cin >> y.matrix[i][j] ;
		}
	}
	
	//返回相乘后的矩阵 
	Matrix answer = Multiply(x, y);
	
	//打印 
	PrintMatrix(answer);
	
	return 0; 
}

//矩阵乘法 
Matrix Multiply(Matrix x, Matrix y) {
	Matrix answer(x.row, y.col);
	//前两个for用于返回 Matrix 赋值 
	for (int i = 0; i < answer.row; i++) {
		for (int j = 0; j < answer.col; j++) {
			answer.matrix[i][j] = 0;
			for (int k = 0; k < x.col; k++) {
				answer.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];
			}
		}
	}
	return answer;
}

//输出矩阵
void PrintMatrix(Matrix x) {
	for (int i = 0; i < x.row; i++) {
		for (int j = 0; j < x.col; j++) {
			cout << x.matrix[i][j] << ' ';
		}
		cout << endl;
	}
} 

发表于 2023-03-23 21:08:32 回复(0)
暴力破解
#include <cstdio>

int main(){
    int a11,a12,a13,a21,a22,a23;
    int b11,b12,b21,b22,b31,b32;
    int c11,c12,c21,c22;

    scanf("%d%d%d%d%d%d%d%d%d%d%d%d",
                    &a11,&a12,&a13,&a21,&a22,&a23,
                    &b11,&b12,&b21,&b22,&b31,&b32);
    c11 = a11*b11 + a12*b21 + a13*b31;
    c12 = a11*b12 + a12*b22 + a13*b32;
    c21 = a21*b11 + a22*b21 + a23*b31;
    c22 = a21*b12 + a22*b22 + a23*b32;
    printf("%d %d\n%d %d\n",c11,c12,c21,c22);
    return 0;
}


发表于 2023-03-13 19:29:10 回复(0)
#include<bits/stdc++.h>
using namespace std;

int M1[2][3];
int M2[3][2];

void Mul() {
    int a[2][2]= {0};
    for(int i=0; i<2; i++) {
        for(int j=0; j<2; j++) {
            for(int k=0; k<3; k++) {
                a[i][j]+=M1[i][k]*M2[k][j];
            }
        }
    }
    for(int i=0; i<2; i++) {
        for(int j=0; j<2; j++) {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return ;
}

int main() {
    for(int i=0; i<2; i++) {
        for(int j=0; j<3; j++) {
            cin>>M1[i][j];
        }
    }
    for(int i=0; i<3; i++) {
        for(int j=0; j<2; j++) {
            cin>>M2[i][j];
        }
    }
    Mul();
    return 0;
}
发表于 2022-10-07 12:04:56 回复(0)
用惯了stl 就再也不会用一般的数组了
#include<iostream>
#include<vector>
using namespace std;

int main() {
    vector< vector<int> > A(2,vector<int>(3));
    vector< vector<int> > B(3,vector<int>(2));
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            int temp;
            cin >> temp;
            A[i][j] = temp;
        }
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            int temp;
            cin >> temp;
            B[i][j] = temp;
        }
    }
    vector<vector<int> > C(2,vector<int>(2));
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            C[i][j] = A[i][0] * B[0][j] + A[i][1] * B[1][j] + A[i][2] * B[2][j];
        }
    }
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            cout<<C[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

发表于 2024-03-25 20:38:03 回复(0)
#include <array>
#include <iostream>
#include <istream>
#include <ostream>
using namespace std;

const int MAXSIZE = 3;  //矩阵最大规模(行数或列数)

struct Matrix {
    array<array<int, MAXSIZE>, MAXSIZE>matrix;
    int rows, cols; //行数和列数

    Matrix(int r, int c): rows(r), cols(c) {}   //构造函数

    //重载输入流运算符
    friend istream& operator>>(istream& in, Matrix& m);

    //重载输出流运算符
    friend ostream& operator<<(ostream& out, const Matrix& m);

    //重载乘法运算符
    friend Matrix operator*(const Matrix& x, const Matrix& y);
};

//重载输入流运算符
istream& operator>>(istream& in, Matrix& m) {
    for (int i = 0; i < m.rows; i++) {
        for (int j = 0; j < m.cols; j++) {
            in >> m.matrix[i][j];
        }
    }
    return in;
}

//重载输出流运算符
ostream& operator<<(ostream& out, const Matrix& m) {
    for (int i = 0; i < m.rows; i++) {
        for (int j = 0; j < m.cols; j++) {
            out << m.matrix[i][j];
            j == m.cols - 1 ? out << endl : out << " ";
        }
    }
    return out;
}

//重载乘法运算符
Matrix operator*(const Matrix& x, const Matrix& y) {
    Matrix result(x.rows, y.cols);
    for (int i = 0; i < result.rows; i++) {
        for (int j = 0; j < result.cols; j++) {
            result.matrix[i][j] = 0;
            for (int k = 0; k < x.cols; k++) {
                result.matrix[i][j] += x.matrix[i][k] * y.matrix[k][j];
            }
        }
    }
    return result;
}

int main() {
    Matrix x(2, 3), y(3, 2);
    cin >> x >> y;
    cout << x * y;
    return 0;
}

发表于 2024-02-08 11:16:38 回复(0)
#include <iostream>
using namespace std;

int main() {
    int a[2][3];
    int b[3][2];
    int c[2][2]={0};
    for(int i=0;i<2;i++)//i选定a的行,j选定a的列
    {
        for(int j=0;j<3;j++)
        {
         cin>>a[i][j];
        }
    }
    for(int i=0;i<3;i++)//i选定b的列,j选定b的行
    {
        for(int j=0;j<2;j++)
        {
         cin>>b[i][j];
        }
    }
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)//a的第i行和b的第j列
        {
            for(int k=0;k<3;k++)
            {
              c[i][j]+=a[i][k]*b[k][j];
            }
         
        }
    }
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<2;j++)
        {
            cout<<c[i][j]<<' ';
        }
        cout<<endl;
    }
   
}
发表于 2023-03-27 21:36:26 回复(0)
#include <stdio.h>

int main() {
    
    int a[2][3];
    int b[3][2];
    int c[2][2];
    int i,j;

    for(i=0;i<2;i++)
        for(j=0;j<3;j++)
            scanf("%d",&a[i][j]);
    for(i=0;i<3;i++)
        for(j=0;j<2;j++)
            scanf("%d",&b[i][j]);

    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            c[i][j] = a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j];
            printf("%d ",c[i][j]);
        }
        printf("\n");
    }

    return 0;
}

发表于 2023-03-12 20:59:49 回复(0)