【高斯消元】CDOJ1785 曜酱的线性代数课堂(三)
高斯消元求行列式板子。
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const double EPS=0.00000001; #define N 105 int n; double B[N][N],A[N][N]; double guass_jordan() { double res=1.0; memcpy(B,A,sizeof(A)); for(int i=1;i<=n;++i)//枚举:正在消除第i个未知数,之后第i个方程废掉,矩阵行、列-1 { int pivot=i; for(int j=i+1;j<=n;++j)//枚举j:把正在处理的未知数的系数的绝对值最大的方程换到第i行 if(fabs(B[j][i])>fabs(B[pivot][i])) pivot=j; swap(B[i],B[pivot]); res*=(-1.0); if(fabs(B[i][i])<EPS){ return 0.0; } for(int j=i+1;j<=n;++j) B[i][j]/=B[i][i]; res*=B[i][i]; for(int j=1;j<=n;++j) if(i!=j)//枚举所有的方程,从第j个方程中消去第i个未知数 for(int k=i+1;k<=n;++k)//依次把第j个方程中的第k个未知数减去应减的数值 B[j][k]-=B[j][i]*B[i][k]; } return res; } int main() { char t[1000]; 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]); } } double ans=guass_jordan(); sprintf(t,"%.3f",ans); if(t[0]=='-' && t[1]=='0' && t[2]=='.' && t[3]=='0' && t[4]=='0' && t[5]=='0'){ puts("0.000"); } else{ printf("%.3f\n",ans); } } return 0; }
相关推荐
lemonade 2020-11-10
yuanran0 2019-12-21
moshlwx 2019-11-15
pp 2019-11-11
何俊林 2019-11-11
xueyuediana 2019-09-21
testxia 2019-06-06
kingzone 2019-05-06
弗泽智能 2019-04-03
yanaoyong 2018-02-25
atbjss 2018-01-09
dujiahaogod 2017-09-21
木瓜子 2019-01-26
BmwGaara 2019-01-25
Anscor 2018-06-18
JesyFong 2018-02-11
robinz 2018-08-30
wangjunyi 2018-06-16