P3389 【模板】高斯消元法
题目背景
Gauss消元
题目描述
给定一个线性方程组,对其求解
输入格式
第一行,一个正整数 nnn
第二至 n+1n+1n+1行,每行 n+1n+1n+1 个整数,为a1,a2⋯an a_1, a_2 cdots a_na1,a2⋯an 和 bbb,代表一组方程。
输出格式
共n行,每行一个数,第 iii行为 xix_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∣≤1041 leq n leq 100, left | a_i ight| leq {10}^4 , left |b ight| leq {10}^4 1≤n≤100,∣ai∣≤104,∣b∣≤104
思路:简单的高斯消元
#include <bits/stdc++.h> using namespace std; double a[101][101],p2; int p1,n; 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++){ p1=i; while (a[p1][i]==0 && p1<=n){ p1++; } if (p1==n+1){ puts("No Solution"); return 0; } for (int j=i;j<=n+1;j++){ swap(a[i][j],a[p1][j]); } p2=a[i][i]; for (int j=i;j<=n+1;j++){ a[i][j]=a[i][j]/p2; } for (int j=1;j<=n;j++){ if (j!=i){ p2=a[j][i]; for (int k=i;k<=n+1;k++){ a[j][k]-=a[i][k]*p2; } } } } for (int i=1;i<=n;i++){ printf("%.2lf ",a[i][n+1]); } return 0; }