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