Insyder01

Untitled

Dec 10th, 2016
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define loop(i, m, n) for(int i(m);i < n;i++)
  3. #define pb push_back
  4. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  5. #define DD(A) loop(i, 0, A.size())cout << A[i] <<" ";
  6. #define in(x) cin >> x
  7. #define clr(A, V) memset(A, V, sizeof(A))
  8. #define ff first
  9. #define ss second
  10. #define readfile(X) freopen(X, "r", stdin)
  11. #define writefile(X) freopen(X, "w", stdout)
  12. using namespace std;
  13. typedef long long ll;
  14. typedef pair<ll,ll> pll;
  15. typedef vector<int> vi;
  16. typedef pair<int,int> pii;
  17. typedef vector<pii> vpii;
  18. typedef pair<int, string> pis;
  19. typedef pair<pair<int, int>, pair<int, int > > piiii;
  20. int BASE = 1e9, sz1, sz2, i, j, carry;
  21. string answer;
  22. vi ans, anss;
  23. void pre(vi &n1, vi &n2){
  24.     int i, j, sz1 = (int)n1.size(), sz2 = (int)n2.size(), carry = 0;
  25. }
  26. void setLarge(vi &n1, vi &n2){
  27.     if(sz1 < sz2) swap(n1, n2);
  28.     else if(sz1 == sz2){
  29.         bool big = 0, f = 1;
  30.         for(int i = 0;i < sz1 && f;i++)
  31.             if(n2[i] > n1[i]) f = 0, big = 1;
  32.             else if(n1[i] > n2[i]) f= 0;
  33.         if(big) swap(n1, n2);
  34.     }
  35. }
  36. vi rev(vi &n1, vi &n2){
  37.     for(int i = (int)n1.size()-1;i>=0;i--) n2.pb(n1[i]);
  38.     return n2;
  39. }
  40. void stream1(vi &n, int &i){
  41.     stringstream ss; string x;
  42.     ss << n[i]; ss >>x;
  43.     if(!i && n[i]) answer+=x;
  44.     else x.insert(0, 9 - (int)x.size(), '0'), answer +=x;
  45. }
  46. void stream2(string &t, vi &n, int &c){
  47.     int x;reverse(t.begin(), t.end());
  48.     stringstream ss; ss << t; ss >> x;
  49.     n.pb(x), t.clear(), c = 0;
  50. }
  51. vi setN(string s){
  52.     vi n, rn;
  53.     int c = 0;
  54.     string t;
  55.     for(int i = (int)s.size()-1;i>=0;i--){
  56.         t+=s[i], c++;
  57.         if(c == 9)
  58.             stream2(t, n, c);
  59.     }
  60.     if(c)
  61.         stream2(t, n, c);
  62.     rn = rev(n, rn);
  63.     return rn;
  64. }
  65. string print(vi &n){
  66.     loop(i, 0, (int)n.size())
  67.         stream1(n, i);
  68.     return answer;
  69. }
  70. string add(vi &n1, vi &n2){
  71.     pre(n1, n2);
  72.     if(sz1 < sz2) swap(n1, n2);
  73.     for(i = (int)n1.size()-1, j = (int)n2.size()-1;i >= 0; i--, j--)
  74.         if(j>=0) ans.pb( (carry + n1[i] + n2[j] ) % BASE), carry = (carry + n1[i] + n2[j] ) / BASE;
  75.         else ans.pb( (carry + n1[i]) % BASE), carry = (carry + n1[i]) / BASE;
  76.     if(carry) ans.pb(carry); anss=rev(ans, anss);
  77.     return print(anss);
  78. }
  79. string sub(vi &n1,vi  &n2){
  80.     pre(n1, n2); setLarge(n1, n2);
  81.         i = (int) n1.size()-1,  j = (int)n2.size()-1;
  82.         for(;i >= 0; i--, j--)
  83.             if(j >= 0)
  84.                 if(n1[i] - n2[j]-carry >= 0)ans.pb(n1[i] - n2[j]-carry), carry = 0;
  85.                 else n1[i] += BASE, ans.pb(n1[i] - n2[j]-carry), carry = 1;
  86.             else ans.pb(n1[i]-carry), carry = 0; anss = rev(ans, anss);
  87.     return print(anss);
  88. }
  89.  
  90. int main() {
  91.     string s1 = "520" , s2 = "20", o;
  92.     vi n1 = setN(s1), n2 = setN(s2);
  93.     o  = add(n1,n2);
  94.     cout << o <<endl;
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment