您的位置:首页 > 其它

【高斯消元】CDOJ1783 曜酱的线性代数课堂(一)

2017-10-05 01:29 357 查看
高斯消元求逆矩阵板子。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const double EPS=0.00000001;
#define N 105
int n;
double B
[N*2],A
[N*2],C

;
bool guass_jordan()
{
memcpy(B,A,sizeof(A));
for(int i=1;i<=n;++i){
for(int j=n+1;j<=n*2;++j){
if(i==j-n){
B[i][j]=1.0;
}
else{
B[i][j]=0.0;
}
}
}
for(int i=1;i<=n;++i){
int pivot=i;
for(int j=i+1;j<=n;++j){
if(fabs(B[j][i])>fabs(B[pivot][i])){
pivot=j;
}
}
swap(B[i],B[pivot]);
if(fabs(B[i][i])<EPS){
return 0;
}
for(int j=i+1;j<=n*2;++j){
B[i][j]/=B[i][i];
}
for(int j=1;j<=n;++j){
if(i!=j){
for(int k=i+1;k<=n*2;++k){
B[j][k]-=B[j][i]*B[i][k];
}
}
}
}
for(int i=1;i<=n;++i){
for(int j=n+1;j<=n*2;++j){
C[i][j-n]=B[i][j];
}
}
}
int T;
int main()
{
//	freopen("nijuzhen2.in","r",stdin);
//	freopen("nijuzhen2.out","w",stdout);
char t[10];
while(scanf("%d",&n)!=EOF){
memset(A,0,sizeof(A));
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%lf",&A[i][j]);
}
}
if(guass_jordan()){
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
sprintf(t,"%.3f",C[i][j]);
if(t[0]=='-' && t[1]=='0' && t[2]=='.' && t[3]=='0' && t[4]=='0' && t[5]=='0'){
printf("0.000%c",j==n ? '\n' : ' ');
}
else{
printf("%.3f%c",C[i][j],j==n ? '\n' : ' ');
}
}
}
}
else{
puts("NO");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: