Insyder01

Untitled

Dec 10th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 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.  
  21. const int BASE = 1e9;
  22. vi rev(vi &n){
  23.     vi rn;for(int i = n.size()-1;i >=0;i--)rn.pb(n[i]);
  24.     return rn;
  25. }
  26. void setLage(vi &n1,vi  &n2, int &sz1, int &sz2){
  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. int auxSet(string &t){
  37.     int x;reverse(t.begin(), t.end());
  38.     stringstream ss; ss << t; ss >> x;
  39.     return x;
  40. }
  41. vi setN(string s){
  42.     vi n, rn;
  43.     int c = 0;
  44.     string t;
  45.     for(int i = (int)s.size()-1;i>=0;i--){
  46.         t+=s[i], c++;
  47.         if(c == 9){
  48.             int temp = auxSet(t);
  49.             n.pb(temp), t.clear(), c = 0;
  50.         }
  51.     }
  52.     if(c){
  53.         int temp = auxSet(t);
  54.         n.pb(temp);
  55.     }
  56.     rn = rev(n);
  57.     return rn;
  58. }
  59. string auxPrint(vi &n, int &i){
  60.     stringstream ss; string x; ss << n[i]; ss >>x;
  61.     return x;
  62. }
  63. string print(vi &n){
  64.     string ans;
  65.     loop(i, 0, (int)n.size())
  66.     if (i == 0 && n[i])
  67.          ans+=auxPrint(n, i);
  68.     else{
  69.         string aux = auxPrint(n, i);
  70.         aux.insert(0, 9 - (int)aux.size(), '0'); ans +=aux;
  71.     }
  72.     return ans;
  73. }
  74. string add(vi &n1, vi &n2){
  75.     vi ans, anss;
  76.     int i, j, sz1 = (int)n1.size(), sz2 = (int)n2.size(), carry = 0;
  77.     if(sz1 < sz2) swap(n1, n2);
  78.     for(i = (int)n1.size()-1, j = (int)n2.size()-1;i >= 0; i--, j--)
  79.         if(j>=0) ans.pb( (carry + n1[i] + n2[j] ) % BASE), carry = (carry + n1[i] + n2[j] ) / BASE;
  80.         else ans.pb( (carry + n1[i]) % BASE), carry = (carry + n1[i]) / BASE;
  81.     if(carry) ans.pb(carry);
  82.     anss = rev(ans);
  83.     return print(anss);
  84. }
  85. string sub(vi &n1,vi  &n2){
  86.     int sz1 = (int)n1.size(), sz2 = n2.size(), carry = 0;
  87.     setLage(n1, n2, sz1, sz2);
  88.     vi ans, anss;
  89.         for(int i = (int) n1.size()-1,  j = n2.size()-1;i >= 0; i--, j--)
  90.             if(j >= 0)
  91.                 if(n1[i] - n2[j]-carry >= 0)ans.pb(n1[i] - n2[j]-carry), carry = 0;
  92.                 else n1[i] += BASE, ans.pb(n1[i] - n2[j]-carry), carry = 1;
  93.             else ans.pb(n1[i]-carry), carry = 0;
  94.     anss = rev(ans);
  95.     return print(anss);
  96. }
  97.  
  98. int main() {
  99.     string res = "0", inp;
  100.     while(1){
  101.         in(inp); if(inp == "0") break;
  102.         vi n1 = setN(res), n2 = setN(inp);
  103.         res = add(n1, n2);
  104.     }
  105.     cout << res <<endl;
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment