#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long long int a[10][10] = { 0 }, b[10][10]; char str[40]; int x = 0, y = 0;
long long int gongyue(long long int m, long long int n) {
if (m == 0 || n == 0) { return 1; }
if (m < 0) { m = -m; }if (n < 0) { n = -n; }
while (m % n && n % m) { if (m > n) { m -= n; } else { n -= m; } }
return m < n ? m : n;
}
int luru(int i, int k) {
int j = 1, n = 0; long long int t = 1;
while (1) {
if (str[i] >= '0' && str[i] <= '9') { n *= 10; n += str[i] - '0'; if (t > 1) { j *= 10; } }
else if (str[i] == '-') { t = -1; }
else if (str[i] == '.') { a[y][k] = t * n; n = 0; if (t == -1) { t = 2; } else { t = 3; } }
else if (str[i] == '/') { a[y][k] = t * n; n = 0; t = -2; }
else if (str[i] == '\0' || str[i] == ' ') {
if (t == 2) { if (n) { t = gongyue(n, j); b[y][k] = j / t; a[y][k] *= b[y][k]; a[y][k] -= n / t; } }
else if (t == 3) { if (n) { t = gongyue(n, j); b[y][k] = j / t; a[y][k] *= b[y][k]; a[y][k] += n / t; } }
else if (t == -2) { t = gongyue(a[y][k], n); a[y][k] /= t; b[y][k] = n / t; }
else { a[y][k] = t * n; }
break;
}i++;
}
while (str[i] == ' ') { i++; }
return i;
}
void print() {
printf("\n\n方程\n ");
for (int i = 0; i < y; i++) {
if (i) { printf(" "); }int k = 0;
for (int j = 0; j < x; j++) {
if (a[i][j] == 0) { continue; }
else if (a[i][j] == 1 && b[i][j] == 1) { if (k) { printf("+"); }printf(" X%d", j); k = 1; continue; }
else if (a[i][j] == -1 && b[i][j] == 1) { printf("- X%d", j); k = 1; continue; }
else if (k && (a[i][j] > 0)) { printf("+ %I64d", a[i][j]); }
else if (a[i][j] < 0) { printf("- %I64d", -a[i][j]); }
else { printf("%I64d", a[i][j]); }
if (b[i][j] != 1) { printf("/%I64d", b[i][j]); }
printf("*X%d", j); k = 1;
}if (k == 0) { printf("0"); }
printf(" = ");
if (b[9][i] == 1) { printf(" %I64d", a[9][i]); }
else { printf(" %I64d/%I64d", a[9][i], b[9][i]); }printf("\n");
}
}
void swap(int i, int l) {
for (int j = 0; j < 10; j++) {
a[9][j] = a[i][j]; a[i][j] = a[l][j]; a[l][j] = a[9][j];
b[9][j] = b[i][j]; b[i][j] = b[l][j]; b[l][j] = b[9][j];
}
}
void sub(int i, int l, int j) {
for (int k = 0; k < 10; k++) {
if (k == x) { k = 9; }
if (k == j) { continue; }
a[l][k] = a[l][k] * b[i][k] * b[l][j] - b[l][k] * a[i][k] * a[l][j];
b[l][k] *= b[i][k] * b[l][j];
long long int t = gongyue(a[l][k], b[l][k]);
a[l][k] /= t; b[l][k] /= t;
}
}
void solve() {
int i, j, k, l;
for (i = 0; i < y; i++) {
a[i][9] = a[9][i]; b[i][9] = b[9][i];
}
for (i = j = 0; i < y; i++, j++) {
for (l = i; j < x; j++) {
while (a[l][j] == 0 && l < y) { l++; }
if (l < y) { if (l != i) { swap(i, l); }break; }l = i;
}if (j == x) { break; }
long long int a1 = a[i][j], b1 = b[i][j];
if (a1 < 0) { a1 = -a1; b1 = -b1; }
for (k = j; k < 10; k++) {
if (k == x) { k = 9; }
a[i][k] *= b1; b[i][k] *= a1;
long long int t = gongyue(a[i][k], b[i][k]);
a[i][k] /= t; b[i][k] /= t;
}
for (l = 0; l < y; l++) {
if (a[l][j] != 0 && i != l) { sub(i, l, j); a[l][j] = 0; }
}
}
}
void show() {
int i, j, k, l, t;
for (i = 0; i < y; i++) {
if (i < x) {
for (j = 0; j < x; j++) {
if (a[i][j] != 0) { break; }
}if (j == x && a[i][9] != 0) { printf("\n\n无解!"); return; }
}
else {
for (j = 0; j < x; j++) {
if (a[i][j] != 0) { printf("\n\n无解!"); return; }
}if (a[i][9] != 0) { printf("\n\n无解!"); return; }
}
}
printf("\n\n通解\n ");
for (i = j = 0; j < x; j++, i++) {
l = i;
for (; i < y; i++) {
if (a[i][j] != 0) { break; }
}if (j) { printf(" "); }
printf("X%d = ", j);
if (i == y) { i = l - 1; printf(" X%d\n", j); continue; }
t = 0;
if (a[i][9] != 0) {
if (b[i][9] == 1) { printf("%I64d", a[i][9]); }
else { printf("%I64d/%I64d", a[i][9], b[i][9]); }t = 1;
}
for (k = j; k < x; k++) {
if (k == j) { continue; }
if (a[i][k] > 0) {
if (b[i][k] == 1) {
if (a[i][k] == 1) { printf(" - X%d", k); }
else { printf(" - %I64d*X%d", a[i][k], k); }
}
else { printf(" - %I64d/%I64d*X%d", a[i][k], b[i][k], k); }t = 1;
}
else if (a[i][k] < 0) {
if (t) { printf("+"); }
if (b[i][k] == 1) {
if (a[i][k] == -1) { printf(" X%d", k); }
else { printf(" %I64d*X%d", -a[i][k], k); }
}
else { printf(" %I64d/%I64d*X%d", -a[i][k], b[i][k], k); }t = 1;
}
}if (t == 0) { printf(" 0"); }printf("\n");
}
}
int main() {
while (1) {
x = y = 0;
int i, k, r, m = 1;
for (i = 0; i < 10; i++) {
for (k = 0; k < 10; k++) {
b[i][k] = 1; a[i][k] = 0;
}
}
printf("请输入方程左部:\n"); loop:
while ((r = scanf("%[^\n]%*c", str)) == 1) {
i = k = m = 0;
while (str[i] != '\0') { i = luru(i, k); k++; if (k > x) { x = k; } }y++;
}if (m) { while (getchar() != '\n'); goto loop; }
printf("请输入方程右部:\n");
while (getchar() != '\n');
r = scanf("%[^\n]%*c", str);
if (r == 0) { getchar(); memset(str, '\0', sizeof(str)); }
k = y; y = 9; i = r = 0;
while (str[i] != '\0') { i = luru(i, r); r++; }y = k;
//a[i][9]与a[9][i]的起因
system("CLS");
print();
if(x<10&&y<10){ solve(); show();}
else { printf("超出限制\n"); }
while (getchar() != '\n');
system("CLS");
}
}