求矩陣的快速冪

原貼 http://blog.csdn.net/mark_meego/article/details/8654619
題目描述:

給定一個n*n的矩陣,求該矩陣的k次冪,即P^k。

輸入:

輸入包含多組測試數據。
數據的第一行爲一個整數T(0<T<=10),表示要求矩陣的個數。
接下來有T組測試數據,每組數據格式如下: 
第一行:兩個整數n(2<=n<=10)、k(1<=k<=5),兩個數字之間用一個空格隔開,含義如上所示。
接下來有n行,每行n個正整數,其中,第i行第j個整數表示矩陣中第i行第j列的矩陣元素Pij且(0<=Pij<=10)。另外,數據保證最後結果不會超過10^8。

輸出:

對於每組測試數據,輸出其結果。格式爲:
n行n列個整數,每行數之間用空格隔開,注意,每行最後一個數後面不應該有多餘的空格。

樣例輸入:
3
2 2
9 8
9 3
3 3
4 8 4
9 3 0
3 5 7
5 2
4 0 3 0 1
0 0 5 8 5
8 9 8 5 3
9 6 1 7 8
7 2 5 7 3
樣例輸出:
153 96
108 81
1216 1248 708
1089 927 504
1161 1151 739
47 29 41 22 16
147 103 73 116 94
162 108 153 168 126
163 67 112 158 122
152 93 93 111 97

由於時間比較倉促,忽略題目的一些細節要求

代碼:
#include <stdio.h>
#include <cstring>
#define T 10

struct matrix
{
	int m[T][T];
}res,origin[T];
void calmatrix(matrix ori[],int q[][2],int matrix_count);	//聲明
matrix multiply(matrix x,matrix y,int n);
int main(void)
{
	int matrix_count;
	int matrix_n_k[T][2];
	do
	{
		scanf("%d",&matrix_count);
		if(matrix_count>0)
		{
			for(int i=0;i<matrix_count;i++)
			{
				scanf("%d %d",&matrix_n_k[i][0],&matrix_n_k[i][1]);
				
				for(int j=0;j<matrix_n_k[i][0];j++)	
					for(int k=0;k<matrix_n_k[i][0];k++)
						scanf("%d",&origin[i].m[j][k]);	
			}
			calmatrix(origin,matrix_n_k,matrix_count);
			
		}
	}while(matrix_count!=0);
	
	printf("finish\n");
	return 0;
	
}

void calmatrix(matrix ori[],int q[][2],int matrix_count)
{
	int a,b;
	for(int count=0;count<matrix_count;count++)
	{
		int n=q[count][1];          //多少次冪
		memset(res.m,0,sizeof(res.m));
		for( a=0;a<q[count][0];a++)
			res.m[a][a]=1;                  //將res.m初始化爲單位矩陣
		//這裏用到二進制思想,如A^156,而156(10)=10011100(2) ,也就有A^156=>(A^4)*(A^8)*(A^16)*(A^128) 
		while(n)
		{
			if(n&1)   //判斷是否是奇數
			{
				res=multiply(res,ori[count],q[count][0]);//q代表幾階(幾行幾列)
			}
			ori[count]=multiply(ori[count],ori[count],q[count][0]);              
			n>>=1;  //將n的二進制表示向右移動一位再賦值給n
		}
		for( a=0;a<q[count][0];a++)
		{	
			for( b=0;b<q[count][0];b++)
				printf("%d ",res.m[a][b]);
			printf("\n");
		}
		
	}
}
matrix multiply(matrix x,matrix y,int n)
{
	int a,b,c;
	matrix temp;
	memset(temp.m,0,sizeof(temp.m));
	for(a=0;a<n;a++)	
		for( b=0;b<n;b++)
			for( c=0;c<n;c++)
				temp.m[a][b]+=x.m[a][c]*y.m[c][b];
			
	return temp;
}

我是小菜鳥啊睡覺
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章