试题 矩阵乘法
蓝桥杯练习系统 - 基础练习VIP试题 BASIC-17
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定一个N阶矩阵A,输出A的M次幂(M是非负整数)
例如:
A =
1 2
3 4
A的2次幂
7 10
15 22
输入格式
第一行是一个正整数N、M(1<=N<=30, 0<=M<=5),表示矩阵A的阶数和要求的幂数
接下来N行,每行N个绝对值不超过10的非负整数,描述矩阵A的值
输出格式
输出共N行,每行N个整数,表示A的M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22
解题思路
一、概念
1.矩阵乘法(还不懂继续百度→矩阵乘法_百度百科)
关键字:二维数组 , 循环 , 矩阵
代码如下
#include<iostream>
using namespace std;
int main()
{
int N,M;
cin>>N>>M;
int A[35][35];
int B[35][35];
int C[35][35];
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
cin>>A[i][j];
B[i][j]=0;
C[i][j]=A[i][j];
}
if(M==0) //0 次幂对角为1
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(i==j)
C[i][j]=1;
else
C[i][j]=0;
}
}
}
else if(M==1) // 1 次幂为本身
{
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
C[i][j]=A[i][j];
}
else
{
for(int r=1;r<M;r++)
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
for(int z=0;z<N;z++)
{
B[i][j]+=C[i][z]*A[z][j];
}
}
}
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
C[i][j]=B[i][j];
B[i][j]=0;
}
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
cout<<C[i][j]<<" ";
cout<<endl;
}
return 0;
}
另一种方法:
来源:【蓝桥杯】基础练习 矩阵乘法
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m;
struct node {
int a[35][35];
node () {
memset(a, 0, sizeof(a));
}
};
node A,res;
//矩阵乘法
node mul(node ans, node ant) {
node t;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
for (int k = 0; k < n; ++k) {
t.a[i][j] += ans.a[i][k] * ant.a[k][j];
}
}
}
return t;
}
//幂
node mul_m(node ans) {
node h,t;
t = ans;
for (int i = 0; i < m - 1; ++i) {
h = mul(t, ans);
t = h;
}
return t;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> A.a[i][j];
}
}
//原矩阵
if (m == 1) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << A.a[i][j] << " ";
}
cout << endl;
}
}
//单位矩阵
else if (m == 0) {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++){
if(i==j)
cout << 1 << " ";
else
cout << 0 << " ";
}
cout << endl;
}
}
else {
node result;
result = mul_m(A);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << result.a[i][j] << " ";
}
cout << endl;
}
}
return 0;
}
总结
将数组B赋值0,所在头文件<memory.h>或<string.h>
memset(B,0,sizeof(B));