Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <iostream>
- #include <sstream>
- #include <cassert>
- using namespace std;
- typedef long long ll;
- struct dr {
- ll zn,a,b;
- };
- int gcd(int a, int b) {
- while (a!=0 && b!=0)
- if (a>b) a%=b; else b%=a;
- return a+b;
- }
- dr readdr(string s) {
- dr ans;
- ans.a=0;
- ans.b=0;
- int pos=0;
- int n=s.size();
- while (s[pos]<'0' && s[pos]>'9' && s[pos]!='-') pos++;
- if (s[pos]=='-') {
- ans.zn=1;
- pos++;
- }
- else ans.zn=0;
- int cel=0;
- while (s[pos]>='0' && s[pos]<='9' && pos<n) {
- cel*=10;
- cel+=s[pos]-'0';
- pos++;
- }
- if (pos==n) {
- ans.b=1;
- ans.a=cel;
- }
- else if (s[pos]=='/') {
- ans.a=cel;
- pos++;
- while (s[pos]>='0' && s[pos]<='9' && pos<n) {
- ans.b*=10;
- ans.b+=s[pos]-'0';
- pos++;
- }
- }
- return ans;
- }
- int main() {
- string s;
- cin >> s;
- dr a = readdr(s);
- cin >> s;
- if (s[0]>='0' && s[0]<='9') {
- dr t = readdr(s);
- a.b=t.b;
- a.a=a.a*t.b+t.a;
- cin >> s;
- }
- char zn = s[0];
- cin >> s;
- dr b = readdr(s);
- if (cin >> s) if (s[0]>='0' && s[0]<='9') {
- dr t = readdr(s);
- b.b=t.b;
- b.a=b.a*t.b+t.a;
- }
- dr ans;
- if (zn=='/') {
- swap(b.a, b.b);
- zn='*';
- }
- if (zn=='*') {
- if (a.zn+b.zn==1) ans.zn=1; else ans.zn=0;
- ans.a=a.a*b.a;
- ans.b=a.b*b.b;
- }
- if (zn=='-') {
- b.zn=1-b.zn;
- zn='+';
- }
- if (zn=='+') {
- if (a.zn==b.zn) {
- ans.zn=a.zn;
- ans.b=a.b*b.b;
- ans.a=a.a*b.b+b.a*a.b;
- }
- else {ans.b=a.b*b.b;
- ans.a=a.a*b.b-b.a*a.b;
- if (b.zn=1) ans.a*=-1;
- if (ans.a<0) { ans.a*=-1; ans.zn=1; }
- }
- }
- if (ans.a==0) {
- cout << "0" << "\n";
- }
- else {
- int g=gcd(ans.a, ans.b);
- ans.a/=g;
- ans.b/=g;
- int cel= ans.a/ans.b;
- ans.a-=ans.b*cel;
- if (ans.zn==1) cout << '-';
- if (cel!=0) cout << cel;
- if (cel!=0 && ans.a!=0) cout << " ";
- if (ans.a!=0) cout << ans.a << "/" << ans.b;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment