解二元一次方程组程序

解二元一次方程组程序

#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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

庄荣涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值