引入
给定一个线性方程组,对其求解或判定无解与无数解的情况
思考
方程怎么解,实数范围内不能枚举啊,那只能学习一下正解了
解法
正解是一种叫做高斯消元的方法
主要思路是将线性方程组的矩阵消元
最终结果是一个除了a[i][i],a[i][n+1]之外所有项都为0的方程
如果a[i][i]变成了0,就无解或无数解
具体实现看代码
ac代码
#include<bits/stdc++.h>
using namespace std;
double a[110][110];
int n,maxx;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)for(int j=1;j<=n+1;j++)scanf("%lf",&a[i][j]);
for(int i=1;i<=n;i++)
{
maxx=i;
for(int j=i+1;j<=n;j++)if(a[j][i]>a[maxx][i])maxx=j;
for(int j=i;j<=n+1;j++)swap(a[i][j],a[maxx][j]);
//我们找到未处理过的第i项最大的一行,与当前行交换
//前面不需要交换是因为已经处理过了
if(!a[i][i])puts("No Solution"),exit(0);
//判断是否无解或无数解
for(int j=1;j<=n;j++)if(i!=j)for(int k=i+1;k<=n+1;k++)
a[j][k]-=a[i][k]*(a[j][i]/a[i][i]);
//消元主过程,就是按照相对系数将此项消去
}
for(int i=1;i<=n;i++)
{
double ans=a[i][n+1]/a[i][i];
printf("%.2lf\n",ans);
}
//得出答案并输出
return 0;
}