luogu2455 [SDOI2006]线性方程组
solution
高斯消元模板。
特别的地方在于判断无解和无穷解。
无解就是出现前面全是0,最后一个为0.
无穷解就是一列全是0。
先判断无解,在判断无穷解
一开始看很多人在这里踩坑,还暗自窃喜自己想到了
然鹅还是踩了好几次坑。
一定要在高斯消元之后判断是否无解!!!!
一定要先判断是不是无解!!!
code
/*
* @Author: wxyww
* @Date: 2020-04-27 09:07:38
* @Last Modified time: 2020-04-27 09:57:23
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 60;
ll read() {
ll x = 0,f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1; c = getchar();
}
while(c >= '0' && c <= '9') {
x = x * 10 + c - '0'; c = getchar();
}
return x * f;
}
double a[N][N];
int n,FLAG;
void NoSolution() {
for(int i = 1;i <= n;++i) {
int flag = 0;
for(int j = 1;j <= n;++j) {
if(fabs(a[i][j]) > 1e-8) {
flag = 1;break;
}
}
if(!flag && fabs(a[i][n + 1]) > 1e-8) {puts("-1");exit(0);}
else if(!flag) {FLAG = 1;}
}
// puts("0");exit(0);
}
void Guass() {
for(int i = 1;i <= n;++i) {
int k = i;
for(int j = i + 1;j <= n;++j)
if(a[j][i] > a[k][i]) k = j;
if(fabs(a[k][i]) <= 1e-8) continue;
swap(a[k],a[i]);
for(int j = 1;j <= n;++j) {
if(i == j) continue;
double tmp = a[j][i] / a[i][i];
// cout<<tmp<<endl;
for(int t = i;t <= n + 1;++t) {
a[j][t] -= a[i][t] * tmp;
}
}
}
}
int main() {
n = read();
for(int i = 1;i <= n;++i)
for(int j = 1;j <= n + 1;++j)
a[i][j] = read();
Guass();
NoSolution();
if(FLAG) {
puts("0");return 0;
}
for(int i = 1;i <= n;++i)
printf("x%d=%.2lf\n",i,a[i][n + 1] / a[i][i]);
return 0;
}
===================================================================================
该怎麼去形容为思念酝酿的痛
夜空霓虹都是我不要的繁荣 ===================================================================================