问题描述:
给你两个n*n的矩阵,请计算并输出它们相乘的结果。
输入:
第1行:1个数N,表示矩阵的大小(2 <= N <= 100)
第2 - N + 1行,每行N个数,对应M1的1行(0 <= M1[i] <= 1000)
第N + 2 - 2N + 1行,每行N个数,对应M2的1行(0 <= M2[i] <= 1000)
输出:
输出共N行,每行N个数,对应M1 * M2的结果的一行。
样例输入:
2 1 0 0 1 0 1 1 0
样例输出:
0 1 1 0
原因分析:
关键点是 三个for中借用新变量k 来实现矩阵的乘法运算,保持行(列)不变,列(行)变
解决方案:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[110][110]={0},b[110][110]={0},c[110][110]={0};
int i,j,n,k;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>b[i][j];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
for(k=0;k<n;k++)
c[i][j]+=a[i][k]*b[k][j];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
return 0;
一般化:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a[110][110]={};
int b[110][110]={};
int c[110][110]={};
int n=0,m=0,p=0;
cin>>n>>m; //矩阵a为n*m(n行m列)
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
cin>>p; //矩阵b为m*p(m行p列)
for(int i=0;i<m;i++)
for(int j=0;j<p;j++)
scanf("%d",&b[i][j]);
for(int i=0;i<n;i++) //矩阵c是a与b相乘得到的
for(int j=0;j<p;j++) //n*p(n行p列)
for(int k=0;k<m;k++)
c[i][j]+=a[i][k]*b[k][j];
for(int i=0;i<n;i++)
{
for(int j=0;j<p;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
return 0;
}