zoukankan      html  css  js  c++  java
  • acwing 883. 高斯消元解线性方程组

    地址 https://www.acwing.com/problem/content/885/

    输入一个包含n个方程n个未知数的线性方程组。

    方程组中的系数为实数。

    求解这个方程组。

    下图为一个包含m个方程n个未知数的线性方程组示例:

    输入格式

    第一行包含整数n。

    接下来n行,每行包含n+1个实数,表示一个方程的n个系数以及等号右侧的常数。

    输出格式

    如果给定线性方程组存在唯一解,则输出共n行,其中第i行输出第i个未知数的解,结果保留两位小数。

    如果给定线性方程组存在无数解,则输出“Infinite group solutions”。

    如果给定线性方程组无解,则输出“No solution”。

    数据范围

    1n1001≤n≤100,
    所有输入系数以及常数均保留两位小数,绝对值均不超过100。

    输入样例:
    3
    1.00 2.00 -1.00 -6.00
    2.00 1.00 -3.00 -9.00
    -1.00 -1.00 2.00 7.00
    输出样例:
    1.00
    -2.00
    3.00

    解法

    使用多个方程变换系数 减少变量x 最终得到答案。

    代码如下

    #include <iostream>
    #include <vector>
    #include <vector>
    #include <math.h>
    
    
    using namespace std;
    
    const int N = 110;
    const double eps = 1e-6;
    int n;
    double a[N][N];
    
    
    int guass()
    {
        int c ,r;
        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];
            }
            for (int i = r + 1; i < n; i++) {
                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 = guass();
        if (t == 0) {
            for (int i = 0; i < n; i++) {
                printf("%.2f
    ",a[i][n]);
            }
        }
        else if(t==1){
            printf("Infinite group solutions");
        }
        else {
            puts("No solution");
        }
    
        return 0;
    }
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    MongoDB 释放磁盘空间 db.runCommand({repairDatabase: 1 })
    RK 调试笔记
    RK Android7.1 拨号
    RK Android7.1 移植gt9271 TP偏移
    RK Android7.1 定制化 itvbox 盒子Launcher
    RK Android7.1 双屏显示旋转方向
    RK Android7.1 设置 内存条作假
    RK Android7.1 设置 蓝牙 已断开连接
    RK Android7.1 进入Camera2 亮度会增加
    RK 3128 调触摸屏 TP GT9XX
  • 原文地址:https://www.cnblogs.com/itdef/p/12081036.html
Copyright © 2011-2022 走看看