高斯消元c++(非常暴力)

暴力方法(如果有优化再更新):

#include<iostream>
using namespace std;

const int maxn = 1000;
int n;
double a[maxn][maxn];
double b[maxn];
void gaussin()
{
    int Flg = -1;                    //判断方程组是否有解:0无解、1有唯一解、2有无穷解
    double fg;
    for(int i=0;i<n;i++){       //化简
        fg=a[i][i];
        for(int j=i+1;j<n;j++){
            double x=a[j][i]/fg;
            for(int k=j;k<n;k++)
                a[j][i]-=x*fg;
            b[j]-=x*fg;
        }
    }
    bool flag;                  //判断方程组是否多解
    for(int i=n-1;i>=0;i--){
        flag = false;
        for(int j=0;j<n;j++){
            if(a[i][j]!=0){
                break;
            }
            if(j==n-1){
                if(b[i] == 0)
                    flag = true;
                else
                    Flg = 0;                    //无解情况
            }
        }
        if(Flg != 0)
            if(flag)
                Flg = 2;
            else
                Flg = 1;
    }
    if(Flg == 0)
        cout << "方程组无解"<<endl;
    else if(Flg == 2)
        cout << "方程组多解" << endl;
    else{
        double s[maxn];
        for(int i=n-1;i>=0;i--){
            for(int j=n-1;j>=i;j--){
                if(j==i)
                    s[i] = b[i]/a[i][j];
                else
                    b[i] -= a[i][j]*s[j];
            }
        }
        cout << "方程组有解:"<<endl;
        for(int i=0;i<n;i++){
            cout << " x"<<i+1<<"="<<s[i]<<endl;
        }
    }
}
int main()
{
    cout << "请输入未知数个数:";
    cin>>n;
    for(int i=0;i<n;i++){
        cout << "请输入第"<<i+1<<"方程式的系数和结果:"<<endl;
        for(int j=0;j<n;j++){
            cin>>a[i][j];
        }
        cin>>b[i];
    }
    gaussin();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Andy-law/p/8964002.html