题目背景
Gauss消元
题目描述
给定一个线性方程组,对其求解
输入输出格式
输入格式:
第一行,一个正整数 nn
第二至 n+1n+1 行,每行 n+1n+1 个整数,为 a_1, a_2 \cdots a_na1,a2⋯an 和 bb ,代表一组方程。
输出格式:
共n行,每行一个数,第 ii 行为 x_ixi (保留2位小数)
如果不存在唯一解,在第一行输出"No Solution".
输入输出样例
输入样例#1:
3
1 3 4 5
1 4 7 3
9 3 2 2
输出样例#1:
-0.97
5.18
-2.39
说明
1≤n≤100,∣ai∣≤104,∣b∣≤104
题解:高斯消元模板
#include <cstdio>
#include <cmath>
#define minn 1E-8
int n;
double a[105][105];
using namespace std;
int main()
{
scanf("%d",&n);
for (int i=0;i<n;i++)
for (int j=0;j<=n;j++) scanf("%lf",&a[i][j]);
for (int i=0;i<n;i++)
{
int t=i;
for (int j=i+1;j<n;j++)//把i行后的i位置与第i行的第i列作比较,尽量减小误差
if (fabs(a[j][i])>fabs(a[t][i])) t=j;//找到了记录一下
if (t!=i)
for (int j=0;j<=n;j++)//把这两行交换一下
{
double tt=a[i][j];
a[i][j]=a[t][j];
a[t][j]=tt;
}
if (fabs(a[i][i])<minn)//minn是接近于0的数,小于minn,即可默认成0
{
printf("No Solution\n");
return 0;
}
for (int j=i+1;j<=n;j++) a[i][j]/=a[i][i];//记录要扩大多少倍
for (int j=0;j<n;j++)
if (i!=j)
for (int k=i+1;k<=n;k++)
a[j][k]-=a[j][i]*a[i][k];//消去一元
}
for (int i=0;i<n;i++) printf("%.2lf\n",a[i][n]);
}