1. 程式人生 > >【高斯消元】CDOJ1785 曜醬的線性代數課堂(三)

【高斯消元】CDOJ1785 曜醬的線性代數課堂(三)

++i for cnblogs mes swa eps mem else 正在

高斯消元求行列式板子。

#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;
}

【高斯消元】CDOJ1785 曜醬的線性代數課堂(三)