这题算是高斯消元模板题,刚看到这题觉得模拟很复杂,百度了多元一次方程的解法后发现了一个叫高斯消元的方法,找到了模板加了一个多解的判断也就过了
#include<bits/stdc++.h>
using namespace std;
int n,pl;
double a[1001][1001];
void Guess(){//高斯消元模板
int flag = 1;//记录是否有解
for(int i = 1; i <= n; i++) {
pl = i;
while(a[pl][i] == 0 && pl <= n)
pl++;// 判断第i列首元素非0的最上行,因为第i行第i列元素不能为0
//if(pl==n+1) {cout<<"No Solution";return 0;}
if(pl == n+1) {
flag = 0;
break;
}//一直判到了n+1行,可是一共才只有n行,说明有一列全为0,此时答案为无解或者多组解
for(int j = 1; j <= n+1; j++) //将第i行第i列元素不为0的那一行与当前行交换
swap(a[i][j],a[pl][j]);
double k = a[i][i]; //让第i行每个元素都除以a[i][i]使得a[i][i]为1
for(int j = 1; j <= n+1; j++)
a[i][j] = a[i][j]/k; //将第i行第i列的元素消成1,注意同行进行同样的操作
for(int j = 1; j <= n; j++) {
if(i != j) { //将第i列除了第i行的元素全消成0
double ki = a[j][i]; //方法是第j行每个元素a[j][m]都减去a[j][1]*a[i][m]
for(int m = 1; m <= n+1; m++)
a[j][m]=a[j][m]-ki*a[i][m];
}
}
}
if(flag == 0) {
int flag2 = 1;
for(int i = 1; i <= n; i++) {
int cnt =0;
for(int j = 1; j <= n; j++) {
if(a[i][j] == 0) {
cnt++;
}
}
if(cnt == n&&a[i][n+1] != 0) {
cout<<"No Solution"<<endl;//高斯消元结束后,若存在系数为0,常数不为0的行,则方程无解
flag = 0;
return;
}
}
if(flag2 == 1) {
cout<<"Multiple Solution"<<endl;//先判断是否是无解情况,如果不是那么就是有多个解
}
} else {
for(int i = 1; i <= n; i++)
printf("%.2lf ",a[i][n+1]);
}
}
int main() {
cin>>n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n+1; j++)
cin>>a[i][j];
Guess();
}
。