makrusak

Untitled

Oct 7th, 2012
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.05 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <sstream>
  4. #include <cassert>
  5.  
  6. using namespace std;
  7. typedef long long ll;
  8. struct dr {
  9.   ll zn,a,b;      
  10. };
  11. int gcd(int a, int b) {
  12.   while (a!=0 && b!=0)
  13.     if (a>b) a%=b; else b%=a;
  14.   return a+b;
  15. }
  16. dr readdr(string s) {
  17.   dr ans;
  18.   ans.a=0;
  19.   ans.b=0;
  20.   int pos=0;
  21.   int n=s.size();
  22.   while (s[pos]<'0' && s[pos]>'9' && s[pos]!='-') pos++;
  23.   if (s[pos]=='-') {
  24.     ans.zn=1;
  25.     pos++;
  26.   }
  27.   else ans.zn=0;
  28.   int cel=0;
  29.   while (s[pos]>='0' && s[pos]<='9' && pos<n) {
  30.     cel*=10;
  31.     cel+=s[pos]-'0';
  32.     pos++;      
  33.   }
  34.   if (pos==n) {
  35.     ans.b=1;
  36.     ans.a=cel;        
  37.   }
  38.   else if (s[pos]=='/') {
  39.     ans.a=cel;
  40.     pos++;
  41.     while (s[pos]>='0' && s[pos]<='9' && pos<n) {
  42.       ans.b*=10;
  43.       ans.b+=s[pos]-'0';  
  44.       pos++;    
  45.     }    
  46.   }
  47.   return ans;
  48. }
  49. int main() {
  50.   string s;
  51.   cin >> s;
  52.   dr a = readdr(s);
  53.   cin >> s;
  54.   if (s[0]>='0' && s[0]<='9') {
  55.     dr t = readdr(s);
  56.     a.b=t.b;
  57.     a.a=a.a*t.b+t.a;
  58.     cin >> s;              
  59.   }
  60.   char zn = s[0];
  61.   cin >> s;
  62.   dr b = readdr(s);
  63.   if (cin >> s) if (s[0]>='0' && s[0]<='9') {
  64.     dr t = readdr(s);
  65.     b.b=t.b;
  66.     b.a=b.a*t.b+t.a;          
  67.   }
  68.   dr ans;
  69.   if (zn=='/') {
  70.     swap(b.a, b.b);
  71.     zn='*';
  72.   }
  73.   if (zn=='*') {
  74.     if (a.zn+b.zn==1) ans.zn=1; else ans.zn=0;
  75.     ans.a=a.a*b.a;
  76.     ans.b=a.b*b.b;
  77.   }
  78.   if (zn=='-') {
  79.     b.zn=1-b.zn;
  80.     zn='+';
  81.   }
  82.   if (zn=='+') {
  83.     if (a.zn==b.zn) {
  84.       ans.zn=a.zn;
  85.       ans.b=a.b*b.b;
  86.       ans.a=a.a*b.b+b.a*a.b;              
  87.     }
  88.     else {ans.b=a.b*b.b;
  89.     ans.a=a.a*b.b-b.a*a.b;
  90.     if (b.zn=1) ans.a*=-1;
  91.     if (ans.a<0) { ans.a*=-1; ans.zn=1; }
  92.     }
  93.   }
  94.   if (ans.a==0) {
  95.     cout << "0" << "\n";
  96.   }
  97.   else {
  98.     int g=gcd(ans.a, ans.b);
  99.     ans.a/=g;
  100.     ans.b/=g;
  101.     int cel= ans.a/ans.b;
  102.     ans.a-=ans.b*cel;
  103.     if (ans.zn==1) cout << '-';
  104.     if (cel!=0) cout << cel;
  105.     if (cel!=0 && ans.a!=0) cout << " ";
  106.     if (ans.a!=0) cout << ans.a << "/" << ans.b;
  107.   }
  108.   return 0;  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment