zoukankan      html  css  js  c++  java
  • 高斯消元模板

    LuoguP3389

    就是一道自己康康+手模的数学题啊qwq

    Code:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const double eps = 1E-8;//因为精度问题所以要取一个十分小的数来作为判断是否为0的标准 
     4 int n;
     5 double a[101][101];//用来存矩阵 
     6 int main () {
     7     scanf("%d", &n);
     8     for (int i = 0; i < n; i++) {
     9         for (int j = 0; j <= n; j++) {
    10             scanf("%lf", &a[i][j]);
    11         }
    12     }
    13     for (int i = 0; i < n; i++) {
    14         int pre = i;
    15         for (int j = i; j < n; j++) {//每次遍历选择一个当前位置系数绝对值最大的调换过来,防止误差 
    16             if (fabs(a[j][i] - a[pre][i]) >= eps) {
    17                 pre = j;
    18             }
    19         }
    20         for (int k = 0; k <= n; k++) {//将这两行交换,把待处理的一行调至上方 
    21             swap(a[i][k], a[pre][k]);
    22         }
    23         if (fabs(a[i][i]) <= eps) {//如果系数为0就一定无解 
    24             printf("No Solution
    ");
    25             return 0;
    26         }
    27         for (int k = i + 1; k <= n; k++) {//将该位系数化一并将这一行系数同除a[i][i] 
    28             a[i][k] /= a[i][i];
    29         }
    30         a[i][i] = 1;//a[i][i]这个位置除或不除都可以,因为它这个位置化 1 后就不会对后面的值造成影响了,可以将其忽略 
    31         for (int j = 0; j < n; j++) {//枚举每一行 
    32             if (i != j) {//不能再处理当前这一行 
    33                 for (int k = i + 1; k <= n; k++) {//这里直接从i+1位置开始即可 
    34                     a[j][k] -= a[j][i] * a[i][k];//就是j行最前面那个不为0的系数乘上i行相应列的位置,然后此位置减去即可 
    35                 }
    36                 //a[j][i] = 0; 加或不加都可以 
    37             }
    38         }
    39     }
    40     for (int i = 0; i < n; i++) {
    41         printf("%.2lf
    ", a[i][n]);//输出答案 
    42     }
    43     return 0;
    44 }
    View Code
  • 相关阅读:
    设计模式——适配器模式
    设计模式——模板方法模式
    03-Web开发(上)
    02-配置文件
    01-QuickStart
    34-多线程(下)
    33-IO(下)
    15-后端编译与优化(待补充)
    14-线程安全与锁优化
    13-JUC(下)
  • 原文地址:https://www.cnblogs.com/Sundial/p/11830550.html
Copyright © 2011-2022 走看看