线性方程组计算器

发布时间 2023-09-14 14:05:43作者: G_A_TS
#include<bits/stdc++.h>
using namespace std;
int m,n,flag[10],bj[10],judge[10],s,r;
long long matrix_up[10][10],matrix_dn[10][10];
long long ans_up[10],ans_dn[10],up,dn;
void input()
{
    cout<<"请输入m行n列增广矩阵中的m、n:"<<endl;
    cin>>m>>n;
    cout<<"请输入增广矩阵:"<<endl;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>matrix_up[i][j];
            matrix_dn[i][j]=1;
        }
        //输入分子,分母初始化为1
        ans_dn[i]=1;
    }    
}
long long gcd(long long a,long long b)
{
    long long r;
    while(b>0)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
void cut(int one,int two,int list)
{
    for(int i=list+1;i<=n;i++)
    {
        matrix_dn[one][i]*=matrix_up[one][list];
        matrix_up[one][i]*=matrix_dn[one][list];
        matrix_dn[two][i]*=matrix_up[two][list];
        matrix_up[two][i]*=matrix_dn[two][list];        
    }
    matrix_dn[one][list]=1;
    matrix_up[one][list]=1;
    matrix_dn[two][list]=1;
    matrix_up[two][list]=1;    
    for(int i=list;i<=n;i++)
    {
        matrix_up[two][i]=matrix_dn[one][i]*matrix_up[two][i]-matrix_dn[two][i]*matrix_up[one][i];
        matrix_dn[two][i]*=matrix_dn[one][i];
    }
}
bool yue_fen(long long a,long long b)
{
    long long div=a/b;
    if(b*div==a)
        return 0;
    up=a/gcd(abs(a),abs(b));
    dn=b/gcd(abs(a),abs(b));    
    return 1;    
}
void work()
{
    for(int list=1;list<=n-1;list++)
    {
        short one=0,two=0;
        for(int i=1;i<=m;i++)
        {
            if(one && matrix_up[i][list]!=0)
            {
                two=i;
                cut(one,two,list);
            }
            if(matrix_up[i][list]!=0 && !bj[i])
            {
                one=i;
                cut(one,0,list);
                flag[list]=i;//搞个指针
                bj[i]=1;//这一行是否处理过
            }
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(matrix_up[i][j])
            {
                judge[i]=1;
                r++;
                if(j!=n)
                    s++;
                break;
            }
        }
    }
    ans_up[n]=-1;ans_dn[n]=1;//bi赋值便于运算
    for(int list=n-1;list>=1;list--)
    {
        for(int i=list+1;i<=n;i++)
        {
            ans_up[list]=ans_up[list]*matrix_dn[list][i]*ans_dn[i]-matrix_up[list][i]*ans_up[i]*ans_dn[list];
            ans_dn[list]*=ans_dn[i]*matrix_dn[list][i];
        }
    }
}
void output()
{
    if(s<r)
    {
        cout<<"无解捏";
        return ;
    }
    else
        if(r<n-1)
        {
            cout<<"无穷多解";
            return;
        }
    for(int i=1;i<=m;i++)
    {
        if(yue_fen(ans_up[i],ans_dn[i])==1)
            cout<<"X"<<i<<"="<<up<<"/"<<dn<<endl;
        else
            cout<<"X"<<i<<"="<<ans_up[i]/ans_dn[i]<<endl;    
    }
}
int main()
{
    input();
    work();
    output();
    return 0;
}