P3389 【模板】高斯消元法
题目背景
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 \leq n \leq 100, \left | a_i \right| \leq {10}^4 , \left |b \right| \leq {10}^41≤n≤100,∣ai?∣≤104,∣b∣≤104
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n; double f[101][101],ans[101]; const double eps=1e-12; int dcmp(double x) { if(x<=eps && x>=-eps) return 0; return (x>0)?1:-1; } bool gauss() { for(int i=1;i<=n;i++) { int num=i; for(int j=i+1;j<=n;j++) if(dcmp(f[i][j]-f[num][i])>0) num=j; if(num!=i) for(int j=1;j<=n+1;j++) swap(f[i][j],f[num][j]); for(int j=i+1;j<=n;j++) if(dcmp(f[j][i])) { double t=f[j][i]/f[i][i]; for(int k=1;k<=n+1;k++) f[j][k]-=t*f[i][k]; } } for(int i=n;i>=1;i--) { if(dcmp(f[i][i])==0) return 0; for(int j=i+1;j<=n;j++) f[i][n+1]-=f[i][j]*ans[j]; ans[i]=f[i][n+1]/f[i][i]; }return 1; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&f[i][j]); if(gauss()) for(int i=1;i<=n;i++) printf("%.2lf\n",ans[i]); else puts("No Solution\n"); return 0; }
时间: 2024-10-14 20:49:42