藍橋杯練習——矩陣乘法

前言

傳送門
這裏要用到一些數學知識,任意一個非零方陣的零次方是單位矩陣,任意一個非零方陣的一次方是它本身。M次冪,只需要矩陣A相乘M-1次,注意每次矩陣相乘的結果存放到一箇中間矩陣temp數組中,這樣做是防止直接更新res數組後,對後面值計算的影響,故等到將整個矩陣計算出結果後,再把temp數組重新賦值給res數組,用於下一次矩陣相乘

正文

問題描述

給定一個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

AC代碼

#include<iostream>
#include<cstdio>
int a[30][30],temp[30][30],res[30][30];
using namespace std;
//輸入結果 
void printRes(int n){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			printf("%d ",res[i][j]);
		}
		cout<<endl;
	}
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			scanf("%d",&a[i][j]);
			res[i][j]=a[i][j];
		}
	}
	//任意一個非零方陣的零次方是單位矩陣
	if(m==0){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(i==j)res[i][j]=1;
				else res[i][j]=0;
			}
		} 
		printRes(n);
	}else if(m==1){//一次冪爲本身 
		printRes(n);
	}else{//二次冪及以上
		for(int k=0;k<m-1;k++){//m-1次相乘
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					int sum=0;
					for(int t=0;t<n;t++){
						sum+=res[i][t]*a[t][j];//計算相乘後i行j列的值 
					}
					temp[i][j]=sum;//賦值給臨時數組
				}
			}	
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					res[i][j]=temp[i][j];//將一次矩陣乘法的結果更新到res中,用於下次相乘 
				} 
			}
		}
		printRes(n); 
	}
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章