Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.49 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 in(x) cin >> x
  6. #define clr(A, V) memset(A, V, sizeof(A))
  7. #define ff first
  8. #define ss second
  9. #define readfile(X) freopen(X, "r", stdin)
  10. #define writefile(X) freopen(X, "w", stdout)
  11. using namespace std;
  12. typedef long long ll;
  13. typedef pair<ll,ll> pll;
  14. typedef vector<int> vi;
  15. typedef pair<int,int> pii;
  16. typedef vector<pii> vpii;
  17. typedef pair<int, string> pis;
  18. typedef pair<pair<int, int>, pair<int, int > > piiii;
  19.  
  20. string add(string s1, string s2){
  21.     bool neg = 0;
  22.     if(s1[0] == '-' && s2[0] == '-') neg = 1, s1.erase(0, 1), s2.erase(0, 1);
  23.     int diff = abs((int)s1.size()-(int)s2.size()), carry = 0;
  24.     string ans;
  25.     if((int)s1.size() > (int)s2.size()) s2.insert(0, diff, '0');
  26.     else if((int)s2.size() > (int)s1.size()) s1.insert(0, diff, '0');
  27.     for(int i = (int)s1.size()-1; i >= 0;i--){
  28.         int r = s1[i]-'0' + s2[i] - '0' + carry;
  29.         if(r > 9)
  30.             ans += (r%10) + '0', carry = 1;
  31.         else
  32.             ans += r + '0', carry = 0;
  33.     }
  34.     if(carry) ans+='1';
  35.     string anss;
  36.     for(int i = (int)ans.size()-1;i>=0;i--) anss+=ans[i];
  37.     if(neg) anss.insert(0, 1, '-');
  38.     return anss;
  39. }
  40. string mul(string s1, string s2){
  41.  
  42.     if(s1 == "0" || s2 == "0") return "0";
  43.     int neg = 0;
  44.     if(s1[0] == '-') s1.erase(0, 1), neg++;
  45.     if(s2[0] == '-') s2.erase(0, 1), neg++;
  46.     if(s1 < s2) swap(s1,s2);
  47.     int idx = 0;
  48.     vector <string> sums;
  49.     for(int i = (int)s2.size()-1;i >= 0 ;i--){
  50.         int carry = 0;
  51.         string t, tt;
  52.         for(int j = (int)s1.size()-1;j >= 0 ;j--){
  53.             int r =(s2[i] - '0') * (s1[j] - '0');
  54.             r+=carry;
  55.             t += ((r%10) + '0');
  56.             carry = r/10;
  57.         }
  58.         if(carry) t+= (carry + '0');
  59.         for(int i = (int)t.size()-1; i>=0;i--) tt += t[i];
  60.         for(int k = 0;k < idx;k++)tt+='0';
  61.         idx++;
  62.         sums.pb(tt);
  63.     }
  64.     string ans= "0";
  65.     loop(i, 0, (int)sums.size())
  66.         ans = add(ans , sums[i]);
  67.     if(neg % 2) ans.insert(0, 1, '-');
  68.     return ans;
  69. }
  70. string sub(string s1, string s2){
  71.    
  72.     char sign[2] ={'+', '+'};
  73.     if(s1[0] == '-') sign[0] = '-', s1.erase(0, 1);
  74.     if(s2[0] == '-') sign[1] = '-', s2.erase(0, 1);
  75.     if(s1 == s2) return "0";
  76.     int diff = abs((int)s1.size() - (int)s2.size());
  77.     if((int)s2.size() < (int)s1.size())s2.insert(0, diff, '0');
  78.     else if((int)s1.size() < (int)s2.size())s1.insert(0, diff, '0');
  79.     if(s1 < s2) swap(s1, s2), swap(sign[0], sign[1]);
  80.     int carry = 0, sz = s1.size()-1;
  81.     string ans;
  82.     for(int i = sz;i >= 0;i--){
  83.         int d1 = s1[i]-'0', d2 = s2[i] -'0';
  84.         if(d1-d2-carry >= 0) ans+= (d1-d2-carry+'0'), carry = 0;
  85.         else{
  86.             d1 += 10;
  87.             ans += (d1-d2-carry) + '0';
  88.             carry = 1;
  89.         }
  90.     }
  91.     string anss;
  92.     for(int i = (int)ans.size()-1;i >= 0;i--) anss+=ans[i];
  93.     if(sign[0] == '-') anss.insert(0, 1, '-');
  94.     return anss;
  95. }
  96. bool compare(string s1, string s2){
  97.     if(s1[0] == '-' && s2[0] != '-') return 0; //-, +
  98.     else if(s1[0] != '-' && s2[0] == '0') return 1; //+, -
  99.     bool neg = 0;
  100.     else if(s1[0] == '-' && s2[0] == '-') neg = 1, s1.erase(0, 1), s2.erase(0, 1);
  101.     int diff = abs((int)s1.size() - (int)s2.size());
  102.     if(s1 > s2) s2.insert(0, diff, '0');
  103.     else if(s2 > s1) s1.insert(0, diff, '0');
  104.     if(!neg)
  105.         s1 > s2 ? return 1:return 0;
  106.     if(neg && s1 < s2)
  107.         s1 < s2 ? return 1:return 0;
  108. }
  109. int main() {
  110.     string s1 = "2", s2 = "222222222222222222222222";
  111.     string ans = mul(s1, s2);
  112.     cout << ans <<endl;
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement