解二元一次方程组程序
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
string fir, sec;
struct equ {
LL digit = 0;
map<char, LL> mp;
} cnt[3];
char unk[3];
int pos = 0;
LL fz[3], fm[3];
void change(string s, int bas) {
bool isr = false, neg = false;
LL num = 0;
for(int i = 0;i < s.size();++i) {
if(isdigit(s[i])) num = 10*num + s[i] - '0';
if(s[i] == '=') {
if(neg == false) cnt[bas].digit -= num;
else cnt[bas].digit += num;
isr = true, neg = false, num = 0;
}
if(isalpha(s[i])) {
if(pos==0 || pos==1&&s[i]!=unk[1]) unk[++pos] = s[i];
if(isr == false) {
if(neg == false) cnt[bas].mp[s[i]] += !num ? 1 : num;
else cnt[bas].mp[s[i]] -= !num ? 1 : num;
}
else {
if(neg == false) cnt[bas].mp[s[i]] -= !num ? 1 : num;
else cnt[bas].mp[s[i]] += !num ? 1 : num;
}
neg = false, num = 0;
}
if(s[i] == '+') {
if(isr == false) {
if(neg == false) cnt[bas].digit -= num;
else cnt[bas].digit += num;
}
else {
if(neg == false) cnt[bas].digit += num;
else cnt[bas].digit -= num;
}
neg = false, num = 0;
}
if(s[i] == '-') {
if(isr == false) {
if(neg == false) cnt[bas].digit -= num;
else cnt[bas].digit += num;
}
else {
if(neg == false) cnt[bas].digit += num;
else cnt[bas].digit -= num;
}
neg = true, num = 0;
}
}
if(neg == false) cnt[bas].digit += num;
else cnt[bas].digit -= num;
}
void init() {
memset(cnt, 0, sizeof cnt);
memset(unk, 0, sizeof unk);
for(int i = 1;i <= 2;++i) {
cnt[i].digit = 0;
cnt[i].mp.clear();
}
pos = 0;
}
int main () {
while(cin >> fir >> sec) {
init();
change(fir, 1);
change(sec, 2);
LL a1 = cnt[1].mp[unk[1]], a2 = cnt[1].mp[unk[2]], b1 = cnt[2].mp[unk[1]], b2 = cnt[2].mp[unk[2]];
LL g = abs(a1)*abs(b1)/__gcd(abs(a1), abs(b1));
LL c1d = cnt[1].digit, a22 = a2, a11 = a1;
a2 *= g/a1, cnt[1].digit *= g/a1, a1 = g;
b2 *= g/b1, cnt[2].digit *= g/b1, b1 = g;
int tot = 0;
if(a1<0) ++tot;
if(b1<0) ++tot;
if(tot%2 == 0) fm[2] = a2-b2, fz[2] = cnt[1].digit-cnt[2].digit;
else fm[2] = a2+b2, fz[2] = cnt[1].digit+cnt[2].digit;
tot = 0;
if(fz[2]<0 && fm[2]<0) fz[2]*=-1, fm[2]*=-1, cnt[1].digit*=-1, cnt[2].digit*=-1;
else if(fz[2]>0 && fm[2]<0) fz[2]*=-1, fm[2]*=-1, cnt[1].digit*=-1, cnt[2].digit*=-1;
g = __gcd(abs(fz[2]), abs(fm[2]));
fz[2] /= g, fm[2] /= g;
fm[1] = fm[2], fz[1] = (fm[1]*c1d) - (fz[2]*a22), fm[1] *= a11;
g = __gcd(abs(fz[1]), fm[1]);
fz[1] /= g, fm[1] /= g;
if(unk[2] < unk[1]) {
if(fz[2]%fm[2] == 0) printf("%c = %lld\n", unk[2], fz[2]/fm[2]);
else printf("%c = %lld/%lld\n", unk[2], fz[2], fm[2]);
if(fz[1]%fm[1] == 0) printf("%c = %lld\n\n", unk[1], fz[1]/fm[1]);
else printf("%c = %lld/%lld\n\n", unk[1], fz[1], fm[1]);
}
else {
if(fz[1]%fm[1] == 0) printf("%c = %lld\n", unk[1], fz[1]/fm[1]);
else printf("%c = %lld/%lld\n", unk[1], fz[1], fm[1]);
if(fz[2]%fm[2] == 0) printf("%c = %lld\n\n", unk[2], fz[2]/fm[2]);
else printf("%c = %lld/%lld\n\n", unk[2], fz[2], fm[2]);
}
}
return 0;
}