欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

矩阵乘法----蓝桥杯

程序员文章站 2022-06-12 12:41:52
...

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

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
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;
}

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

相关标签: 蓝桥