AcWing
  • 首页
  • 活动
  • 题库
  • 竞赛
  • 应用
  • 其它
    • 题解
    • 分享
    • 商店
    • 问答
  • 吐槽
  • 登录/注册

AcWing 883. 高斯消元解线性方程组    原题链接    简单

作者: 作者的头像   L-China ,  2023-01-25 20:41:50 ,  所有人可见 ,  阅读 26


3


C++


$\color{#cc33ff}{— > 算法基础课题解}$


#include<iostream>
#include<algorithm>
#include<math.h>

using namespace std;

const int N = 110;
const double eps = 1e-6;

int n;
double a[N][N];

int gauss() {
    int r, c; // c 代表列 col, r 代表行 row
    for (c = 0, r = 0; c < n; c ++) { // 枚举每一列
        int t = r; // 找到当前这一列绝对值最大的这一行
        for (int i = r; i < n; i ++)
            if (fabs(a[i][c]) > fabs(a[t][c]))
                t = i;

        if (fabs(a[t][c]) < eps) continue;

        for (int i = c; i <= n; i ++) swap(a[t][i], a[r][i]); // 将绝对值最大的行换到最顶端
        for (int i = n; i >= c; i --) a[r][i] /= a[r][c]; // 将当前行的首位变成1
        for (int i = r + 1; i < n; i ++) // 用当前行将下面所有的列消成0
            if (fabs(a[i][c]) > eps)
                for (int j = n; j >= c; j --)
                    a[i][j] -= a[r][j] * a[i][c];

        r ++;            
    }

    if (r < n) {
        for (int i = r; i < n; i ++)
            if (fabs(a[i][n]) > eps)
                return 2; // 无解
        return 1; // 无穷多组解        
    }

    for (int i = n - 1; i >= 0; i --) 
        for (int j = i + 1; j < n; j ++)
            a[i][n] -= a[i][j] * a[j][n];

    return 0; // 有唯一解
}

int main() {
    cin >> n;
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < n + 1; j ++)
            cin >> a[i][j];

    int t = gauss();

    if (t == 0) { // 唯一解
        for (int i = 0; i < n; i ++) {
            if (fabs(a[i][n]) < eps) a[i][n] = 0;  // 去掉输出 -0.00 的情况
            printf ("%.2lf\n", a[i][n]);
        }
    }
    else if (t == 1) puts("Infinite group solutions"); // 无穷多组解
    else puts("No solution"); // 无解

    return 0;
}

0 评论

你确定删除吗?
1024
x

© 2018-2023 AcWing 版权所有  |  京ICP备17053197号-1
用户协议  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息