高斯消元解线性方程组

高斯消元解线性方程组

输入一个包含 n个方程 n个未知数的线性方程组。
方程组中的系数为实数。
求解这个方程组。
下图为一个包含 m个方程 n个未知数的线性方程组示例
在这里插入图片描述
输入格式
第一行包含整数 n。
接下来 n行,每行包含 n+1个实数,表示一个方程的 n个系数以及等号右侧的常数。
输出格式
如果给定线性方程组存在唯一解,则输出共 n行,其中第 i行输出第 i个未知数的解,结果保留两位小数。
如果给定线性方程组存在无数解,则输出 Infinite group solutions。
如果给定线性方程组无解,则输出 No solution。
输入样例:
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

#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

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

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

int gauss(){
    int c,r;//c: column列, 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++){
            if(fabs(a[i][c])>eps){
                for(int j=n;j>=c;j--) a[i][j]-=a[i][c]*a[r][j];//消元
            }
        }
        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(){
    scanf("%d",&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++) printf("%.2lf\n",a[i][n]);
    }
    else if(t==1) puts("Infinite group solutions");
    else puts(" No solution");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值