高斯消元(唯一解)

【问题描述】 
  贾老二是个品学兼优的好学生,但由于智商问题,算术学得不是很好,尤其是在解方程这个方面。虽然他解决 2x=2 这样的方程游刃有余,但是对于 {x+y=3 x-y=1} 这样的方程组就束手无策了。于是他要你来帮忙。前提是一次方程组且保证在integer的范围内可以处理所有问题。
【输入格式】 
  第一行一个数字N(1≤N≤100)表示要求的未知数的个数,同时也是所给的方程个数。
  第2到N+1行,每行N+1个数。前N个表示第1到N个未知数的系数。第N+1个数表示N个未知数乘以各自系数后的加和。(保证有唯一整数解)
【输出格式】 
  一行N个数,表示第1到N个未知数的值。
【输入样例】 
2
1 1 3
1 –1 1
【输出样例】 
2 1
【数据范围】 
1≤N≤100
【来源】   
https://vijos.org/p/1052
 
#include<bits/stdc++.h>
using namespace std;
int n;
double D[105];
double JZ[105][105];//存储矩阵 
void XY()
{
    for(int i=0;i<n;i++)
    {
        int r=i; 
        for(int k=i+1;k<n;k++)
        {
            if(abs(JZ[r][i])<abs(JZ[k][i])) r=k;//寻找第i列元素最大值所在行数 
        }
        if(r!=i) for(int j=i;j<=n;j++) swap(JZ[r][j],JZ[i][j]);//交换位置 
        double a=JZ[i][i];
        if(a)
        {
            for(int j=i+1;j<n;j++)
            {
               double b=JZ[j][i];
               for(int k=i;k<=n;k++) JZ[j][k]-=JZ[i][k]*b/a;
            }
        }
    }
}
void Q()//求解 
{
    D[n-1]=JZ[n-1][n]/JZ[n-1][n-1];
    for(int i=n-2;i>=0;i--)
    {
        for(int j=i+1;j<n;j++)
        JZ[i][n]-=D[j]*JZ[i][j];
        D[i]=JZ[i][n]/JZ[i][i];
    }
    for(int i=0;i<n;i++)
    {
        int g=D[i]+0.5;//注意这里要+0.5才能保证正确 
        cout<<g<<" ";
    }
}
int main()
{

    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            cin>>JZ[i][j];
        }
    }
    XY();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            cout<<JZ[i][j]<<" ";
        }
        cout<<endl;
    }
    Q();
}

猜你喜欢

转载自www.cnblogs.com/Charls/p/12650724.html