矩阵乘法----蓝桥杯

矩阵乘法----蓝桥杯_第1张图片
核心就是如何求取两个矩阵的乘法,数学线代中两个矩阵相乘之后的矩阵中c[i][j]是由左边矩阵(矩阵相乘时)的第i行中的所有元素分别与右边矩阵中的第j列中的元素相乘得到的和。c[i][j]+=a[i][jj]*b[jj][j];(核心一步)
AC代码:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int a[35][35],b[35][35],c[35][35];//数组b代表每次需要乘的矩阵,数组a代表最后的结果 ,c中间变量 
int main() 
{
	int n,m,i,j,ci,k,kk;
	cin>>n>>m;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			cin>>a[i][j];
	if(m==0)//m==0代表是单位矩阵 
	{
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
			{
				if(i==j)
					a[i][j]=1;
				else
					a[i][j]=0;
			}
	}
	else
	{
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
				b[i][j]=a[i][j];//赋予数组b值,和输入的a数组是一毛一样的 
		k=0;
		for(ci=1;ci<m;ci++)//乘以矩阵b的次数 
		{
			for(i=0;i<n;i++)
			{
				for(j=0;j<n;j++)
				{
					for(int jj=0;jj<n;jj++)
					{
						c[i][j]+=a[i][jj]*b[jj][j];//最核心的步骤(根据线代数学的矩阵乘法) 
					}
				}
			}
			for(i=0;i<n;i++)
				for(j=0;j<n;j++)
					a[i][j]=c[i][j];//数组a代表转化后的最后的结果 ,数组c代表存取更新的结果(中间变量)
			memset(c,0,sizeof(c));//将数组c赋值0便于下次计算使用这个中间变量 
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			cout<<a[i][j]<<" ";
		cout<<endl;
	}		
	return 0;
}

这个题挺简单的,只是第一次接触的话,核心的那个步骤容易想不出来,我也是想了很大一会才慢慢调试出来的。感觉还是不难,还是自己太菜了,没有那么快就想出来这个核心的一句话。

你可能感兴趣的:(蓝桥)