5272: 逆矩阵
Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 11 Accepted:7
Description
设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E(单位矩阵)。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。
现在告诉你一个n阶方阵A,求它的逆矩阵B。
Input
输入数据有多组,第一行为数据组数T,接下来有T个矩阵。
每个矩阵的第一行为n(n<20),表示n阶方阵,接下来的n行n列表示n*n的矩阵
矩阵元素为实数。
Output
按照n行n列输出逆矩阵B,所有元素保留2位小数。数据保证一定有逆矩阵。
Sample Input
1
51.3 0.8 0.5 0.8 1.00.5 0.6 1.0 1.3 1.00.8 1.4 0.9 1.1 1.41.0 0.6 0.8 1.4 0.50.7 0.6 1.4 1.4 1.2Sample Output
0.86 -1.37 -0.36 0.37 0.69
-1.10 -1.90 1.71 0.93 0.12-1.08 -4.01 0.72 0.64 3.140.01 3.06 -0.61 0.33 -1.991.29 2.85 -0.77 -1.81 -0.97Source
我提供了两种方法
LU分解
#includeconst int N=21;double a[N][N],b[N][N],c[N][N],bt[N][N],ct[N][N],ans[N][N];int T,n;void LU(){ for(int i=0; i =0; j--) { s=0; for(int k=j+1; k<=i; k++) s+=c[j][k]*ct[k][i]; ct[j][i]=-s/c[j][j]; } for(int i=0; i
Gauss 消元
#include#include #include const double eps=1e-4;const int N=21;double a[N][N],b[N],x[N],s,t[N][N],ans[N][N];int n;void gauss(){ int i; for(int k=1; k<=n; k++) { for(i=k; i<=n&&fabs(a[i][k]) =1; --i) { s=b[i]; for(int j=i+1; j<=n; j++)s-=x[j]*a[i][j]; x[i]=s/a[i][i]; if(fabs(x[i])