题目大意:给出两个等式,求其中的未知数x和y,注意输入格式,每组数据间有一空行。
解题思路:读入数据的时候,用flag记录是在等号左边还是右边,sign记录读取num前的符号,注意-x的情况,既没有数值。然后统一将所有项移动至左边,让右边等0,这样只用记录a,b,c即可。
计算答案,A = a1*b2 - a2*b1, B = c1 * b2 - c2 * b1, C = c1* a2 - c2 * a1;
x = -B/A, y = C/A;
那么如果A不为0的话,即可直接计算出x和y,注意通分。
A为0,那么就要分多钟情况来进行考虑。
如果是a1 = a2 = 0,就要判断考虑b1 = 0,而b2 和c2不为0以及b2 = 0而b1和c1不为0的情况。这样就可以确定y不能确定x;如果b1和b2都不为0,那么就得看两个y是否矛盾。
同理计算b1 = b2 = 0;
其他情况肯定就求不出来了。
#include <stdio.h>
#include <string.h>
const int N = 1005;
const int M = 2;
typedef long long ll;
ll g[M][M*2];
struct rNum {
ll son, mom;
bool sign;
rNum () {
son = mom = 0;
sign = false;
}
void put () {
if (son == 0)
printf("0");
else {
if (sign) printf("-");
printf("%lld", son);
if (mom != 1) printf("/%lld", mom);
}
printf("\n");
}
bool operator == (const rNum& c) {
if (son == 0 && c.son == 0) return true;
return (sign == c.sign)
&& (son == c.son)
&& (mom == c.mom);
}
};
void cat (char* s, ll* u) {
int len = strlen(s);
ll flag = 1, sign = 1, num = 0;
for (int i = 0; i <= len; i++) {
if (s[i] == '-') {
sign *= -1;
} else if (s[i] == '=') {
flag *= -1;
} else if (s[i] == '+') {
sign = 1;
} else if (s[i] == 'x') {
if (num == 0) num = 1;
u[0] += (num * flag * sign);
num = 0;
sign = 1;
} else if (s[i] == 'y') {
if (num == 0) num = 1;
u[1] += (num * flag * sign);
num = 0;
sign = 1;
} else if (s[i] >= '0' && s[i] <= '9') {
num = num * 10 + s[i] - '0';
} else if (num) {
u[2] += (num * flag * sign);
num = 0;
sign = 1;
}
}
}
void init () {
memset(g, 0, sizeof(g));
getchar();
char str[N];
for (int i = 0; i < 2; i++) {
gets(str);
cat (str, g[i]);
}
/*
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++)
printf("%lld ", g[i][j]);
printf("\n");
}
printf("\n");
*/
}
ll gcd (ll a, ll b) {
return b == 0 ? a : gcd(b, a%b);
}
rNum get (ll a, ll b) {
rNum ans;
ans.sign = (a * b < 0);
if (a < 0) a = -a;
if (b < 0) b = -b;
ans.son = b;
ans.mom = a;
if (b == 0) return ans;
ll d = gcd(a, b);
ans.son /= d;
ans.mom /= d;
return ans;
}
void solve () {
ll a1 = g[0][0], a2 = g[1][0];
ll b1 = g[0][1], b2 = g[1][1];
ll c1 = g[0][2], c2 = g[1][2];
ll a = a1 * b2 - a2 * b1;
if (a == 0) {
if (a1 == 0 && a2 == 0) {
printf("don't know\n");
if (b1 && b2 == 0 && c2 == 0) {
rNum x = get(b1, -c1);
x.put();
} else if (b1 == 0 && c1 == 0 && b2) {
rNum x = get(b2, -c2);
x.put();
} else if (b1 && b2) {
rNum x1 = get(b1, -c1);
rNum x2 = get(b2, -c2);
if (x1 == x2)
x1.put();
else
printf("don't know\n");
} else
printf("don't know\n");
} else if (b1 == 0 && b2 == 0) {
if (a1 && a2 == 0 && c2 == 0) {
rNum x = get(a1, -c1);
x.put();
} else if (a1 == 0 && c1 == 0 && a2) {
rNum x = get(a2, -c2);
x.put();
} else if (a1 && a2) {
rNum x1 = get(a1, -c1);
rNum x2 = get(a2, -c2);
if (x1 == x2)
x1.put();
else
printf("don't know\n");
} else
printf("don't know\n");
printf("don't know\n");
} else
printf("don't know\ndon't know\n");
return;
}
ll b = c1 * b2 - c2 * b1;
ll c = g[0][2] * g[1][0] - g[1][2] * g[0][0];
//printf("%d %d %d\n", a, b, c);
rNum x = get(a, b*(-1));
rNum y = get(-a, -c);
x.put();
y.put();
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
init ();
solve ();
if (cas) printf("\n");
}
return 0;
}