洛谷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 \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<cmath> #define maxn 110 #define eps 0.000000001 using namespace std; int n; double a[maxn][maxn]; void guass(){ for(int i=1;i<=n;i++){//枚举每个未知量 int p=i; for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[p][i]))p=j;//查找哪一个式子中的该未知量系数最大 for(int j=1;j<=n+1;j++)swap(a[i][j],a[p][j]);//让它成为第i个式子 double tmp=a[i][i];//系数化为一用 if(fabs(tmp)<eps)continue;//因为后面涉及到除法操作,不允许0的存在 for(int j=1;j<=n+1;j++)a[i][j]/=tmp; for(int j=1;j<=n;j++){ if(j==i)continue; double tmp=a[j][i]; for(int k=1;k<=n+1;k++){ a[j][k]-=tmp*a[i][k]; } } } } int main(){ freopen("Cola.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n+1;j++) scanf("%lf",&a[i][j]); guass(); bool wujie=0,duojie=0; for(int i=1;i<=n;i++){//枚举每个等式 int cnt=0; for(int j=1;j<=n+1;j++){ if(fabs(a[i][j])<eps)cnt++; else break; } if(cnt==n)wujie=1; if(cnt==n+1)duojie=1; } if(wujie||duojie){puts("No Solution");return 0;} for(int i=1;i<=n;i++){ printf("%.2lf\n",a[i][n+1]); } }