ZOJ 3645高斯消元

高斯消元是求方程组解的一般方法:

它在求矩阵的逆矩阵的时候也最方便的方法

View Code
#include <stdio.h>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;
#define max(a,b) ((a) > (b) ? (a) : (b))
#define min(a,b) ((a) < (b) ? (a) : (b))
#define eps 1e-6
const int Max = 19;

double mat[Max][Max];
double c[Max][Max];
double ans[Max];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        for(int i=0;i<12;i++){
            for(int j=0;j<12;j++){
                scanf("%lf",&mat[i][j]);
            }
        }
        for(int i=0;i<12;i++)
            c[i][11] = mat[i][11]*mat[i][11];
        for(int i=0;i<12;i++){
            for(int j=0;j<11;j++){
                c[i][j] = -2*mat[i][j];
                c[i][11] -= mat[i][j]*mat[i][j];
            }
        }
        for(int i=0;i<11;i++){
            for(int j=0;j<12;j++){
                c[i][j]-=c[i+1][j];
            }
        }
        for(int i=0;i<11;i++){
            if(c[i][i] == 0){
                for(int j=i+1;j<11;j++){
                    if(c[j][i] != 0){
                        for(int k=0;k<12;k++)
                            swap(c[i][k],c[j][k]);
                        break;
                    }
                }
            }
            for(int j=i+1;j<11;j++){
                double be = c[j][i]/c[i][i];
                if(be == 0)
                    continue;
                for(int k=i;k<12;k++){
                    c[j][k] -= c[i][k]*be;
                }
            }
        }
        ans[10] = c[10][11]/c[10][10];
        for(int i=9;i>=0;i--){
            ans[i]=c[i][11];
            for(int j=i+1;j<11;j++){
                ans[i]-=c[i][j]*ans[j];
            }
            ans[i] /= c[i][i];
        }
        for(int i=0;i<10;i++){
            printf("%.2lf ",ans[i]+eps);
        }
        printf("%.2lf\n",ans[10]+eps);
    } 
    return 0;
}
原文地址:https://www.cnblogs.com/gray035/p/3008290.html