++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 曜酱的线性代数课堂(三)
来源: http://www.bubuko.com/infodetail-2337390.html