#1数据:
in:
2
1 1 2
3 3 6
out:
No Solution
Code:
#include <iostream>
#include <cmath>
#define int long long
using namespace std;
typedef double db;
const int N = 1010;
int n;
bool flag;
db a[N][N], b[N], x[N];
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') f = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline void write(int x) {
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
void Guass(){
for (int i = 1; i <= n; i++) {
int r = i;
for (int j = i + 1;j <= n; j++) {
if (abs(a[j][i]) > abs(a[r][i])) {
r = j;
}
}
if (r != i) {
for (int j = i; j <= n; j++) {
swap(a[r][j], a[i][j]);
}
swap(b[r], b[i]);
}
for (int j = i + 1; j <= n; j++) {
if (a[i][i] == 0) {
puts("No Solution");
flag = true;
break;
}
db k = a[j][i] / a[i][i];
for (int l = i; l <= n; l++)
a[j][l] -= k * a[i][l];
b[j] -= k * b[i];
}
if(flag) break;
}
if(flag) return;
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] != 0) {
puts("No Solution");
flag = true;
}
if(cnt == n + 1) {
puts("No Solution");
flag = true;
}
}
for (int i = n; i >= 1; i--) {
if (a[i][i] == 0) {
puts("No Solution");
flag = true;
break;
}
x[i] = b[i] / a[i][i];
for (int j = i - 1; j >= 1; j--) {
b[j] -= a[j][i] * x[i];
}
}
}
signed main() {
n =read();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
a[i][j] = read();
}
b[i] = read();
}
Guass();
if(flag) return 0;
for (int i = 1; i <= n; i++)
printf("%.2lf\n", x[i]);
return 0;
}
评测记录: