zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    创建用户中遇到的问题
    创建用户和用户组
    ActiveMq在linxu系统上的启动
    CentOs 6.5 安装jdk
    卸载CentOs6.5自带的OpenJDK
    centos 6.5 添加ip地址
    CentOs 6.5的安装
    jna的简单测试
    电脑硬盘空间怎么越来越小
    build path contains duplicate entry:'src' for project 'XXX'
  • 原文地址:https://www.cnblogs.com/gray035/p/3008290.html
Copyright © 2011-2022 走看看