蓝桥杯_基础练习 矩阵乘法

问题描述
  给定一个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

需要注意0次幂的情况!!

#include<iostream>
using namespace std;
int matrix[35][35];
int tmp[35][35];
int save[35][35];
int main()
{
	int N, M, sum;
	cin >> N >> M;
	for(int i = 0; i < N; ++i)
		for(int j = 0; j < N; ++j)
		{
			cin >> matrix[i][j];
			tmp[i][j] = matrix[i][j];
		} 
	while(M > 1)
	{
		M--;
		for(int i = 0; i < N; ++i)
			for(int j = 0; j < N; ++j)
				{
					sum = 0;
					for(int n = 0; n < N; ++n)
						sum += matrix[i][n]*tmp[n][j];
					save[i][j] = sum;
				}
		for(int i = 0; i < N; ++i)
		{
			for(int j = 0; j < N; ++j)
			{
				matrix[i][j] = save[i][j];
			}
		}
				
	}
	if(M == 0)
	{
		for(int i = 0; i < N; i++)
			for(int j = 0; j < N; ++j)
			{
				if(i == j)
					matrix[i][j] = 1;
				else
					matrix[i][j] = 0;
			} 
	}
	for(int i = 0; i < N; ++i)
	{
		for(int j = 0; j < N; ++j)
			cout << matrix[i][j] << ' ';
		cout << endl;
	}
		

	return 0;
}

此外这里可以用vector构建二维数组,

typedef vector<int> v;

typedef vector<v> mat;

用 vector<vector<int> >  mat(n, vector(m));//行为n列为m的二维数组

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<string.h>
#include<vector>
using namespace std;
typedef vector<int> v;
typedef vector<v> mat;
int n, m;


//。。。以前做过的题目,现在又差不多忘光了吧。。。主要是忘记了vector的用法
//vector还是要好好学一学, vector<int> v 定义一个叫v的存储整型的向量,用vector定义二维数组(矩阵的方法) vector<v> mat;
//若要在定义一个向量矩阵的时候给它分配指定的空间大小的话,用 vector<vector<int> >mat(n, vector<int>(m)) 则行为n,列为m

mat MAT(mat &a, mat &b){
    mat c(a.size(), v(b[0].size()));
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            for(int k=0; k<n; k++){
                c[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return c;
}
mat MATRIX(mat a, int b){
    mat ans(n, v(n));
    for(int i=0; i<n; i++){
        ans[i][i] = 1;
    }
    if(b == 0)
    	return ans;
    while(b>0){
        ans = MAT(ans, a);
        b--;
    }
    return ans;
}
int main(){
    cin >> n >> m;
    mat a(n, v(n));
    mat ans(n, v(n));
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            cin >> a[i][j];
        }
    }
    ans = MATRIX(a, m);
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cout << ans[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41282102/article/details/88423192