标签:
矩阵的n次方 |
分类: 编程算法 |
(一)慢速的算法 O(N^3)
#include
<stdio.h>
#include
<stdlib.h>
//动态分配二维数组
//相当于 int t[][]
int **malloc2d(int r, int c)
{
}
// src --
源矩阵
// size --
矩阵的阶
// xpower --
次方
int **MatrixPower(int
**src, int size, int xpower)
{
}
int main()
{
scanf("%d",
&a[i][j]);
printf("a[n][n]:\n");
for(i=0; i
{
for(j=0; j
printf("%d ",a[i][j]);
printf("\n");
}
for(i=0; i
{
for(j=0; j
printf("%d ",result[i][j]);
printf("\n");
}
}
运行结果:
(二)二分法 O(logE * N^3
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define MAXN 50
typedef struct Matrix
{
int s[MAXN][MAXN];
}M;
//矩阵 a*b
M Multiply(M a, M b, int
size)
{
int i,j,id;
M c;
memset(c.s,0,sizeof(c.s));
for(i=0;
i<size; ++i)
for(j=0;
j<size; ++j)
for(id=0;
id<size; ++id)
c.s[i][j] += a.s[i][id] *
b.s[id][j];
return c;
}
// src --
源矩阵
// size --
源矩阵阶数
// t -- t次方
M Pow(M src, int size,
int t)
{
M d;
int i;
if(t==0)
{
memset(d.s, 0,
sizeof(d.s));
for(i=0;
i<size; ++i)
d.s[i][i]=1;
return d;
}
else
{
M
des=Pow(src,size,t/2);
if(t&1)
//t是奇数
return
Multiply(Multiply(des,des,size),src,size);
else
return
Multiply(des,des,size);
}
}
int main()
{
// 求n阶矩阵的k次方
int n,k,i,j;
while(scanf("%d%d",&n,&k)
!= EOF)
{
M a;
for(i=0; i<n;
++i)
for(j=0; j<n;
++j)
scanf("%d",&a.s[i][j]);
printf("a[n][n]:\n");
for(i=0; i<n;
++i)
{
for(j=0; j<n;
++j)
printf("%d ",a.s[i][j]);
printf("\n");
}
M matpow = Pow(a, n, k);
printf("matpow[n][n]:\n");
for(i=0; i<n;
++i)
{
for(j=0; j<n;
++j)
printf("%d
",matpow.s[i][j]);
printf("\n");
}
}
return 0;
}
运行结果:
前一篇:龙门镖局