题目背景
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]); }