Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define loop(i, m, n) for(int i(m);i < n;i++)
- #define pb push_back
- #define D(X) cout<<" "<<#X": "<<X<<endl;
- #define in(x) cin >> x
- #define clr(A, V) memset(A, V, sizeof(A))
- #define ff first
- #define ss second
- #define readfile(X) freopen(X, "r", stdin)
- #define writefile(X) freopen(X, "w", stdout)
- using namespace std;
- typedef long long ll;
- typedef pair<ll,ll> pll;
- typedef vector<int> vi;
- typedef pair<int,int> pii;
- typedef vector<pii> vpii;
- typedef pair<int, string> pis;
- typedef pair<pair<int, int>, pair<int, int > > piiii;
- string add(string s1, string s2){
- bool neg = 0;
- if(s1[0] == '-' && s2[0] == '-') neg = 1, s1.erase(0, 1), s2.erase(0, 1);
- int diff = abs((int)s1.size()-(int)s2.size()), carry = 0;
- string ans;
- if((int)s1.size() > (int)s2.size()) s2.insert(0, diff, '0');
- else if((int)s2.size() > (int)s1.size()) s1.insert(0, diff, '0');
- for(int i = (int)s1.size()-1; i >= 0;i--){
- int r = s1[i]-'0' + s2[i] - '0' + carry;
- if(r > 9)
- ans += (r%10) + '0', carry = 1;
- else
- ans += r + '0', carry = 0;
- }
- if(carry) ans+='1';
- string anss;
- for(int i = (int)ans.size()-1;i>=0;i--) anss+=ans[i];
- if(neg) anss.insert(0, 1, '-');
- return anss;
- }
- string mul(string s1, string s2){
- if(s1 == "0" || s2 == "0") return "0";
- int neg = 0;
- if(s1[0] == '-') s1.erase(0, 1), neg++;
- if(s2[0] == '-') s2.erase(0, 1), neg++;
- if(s1 < s2) swap(s1,s2);
- int idx = 0;
- vector <string> sums;
- for(int i = (int)s2.size()-1;i >= 0 ;i--){
- int carry = 0;
- string t, tt;
- for(int j = (int)s1.size()-1;j >= 0 ;j--){
- int r =(s2[i] - '0') * (s1[j] - '0');
- r+=carry;
- t += ((r%10) + '0');
- carry = r/10;
- }
- if(carry) t+= (carry + '0');
- for(int i = (int)t.size()-1; i>=0;i--) tt += t[i];
- for(int k = 0;k < idx;k++)tt+='0';
- idx++;
- sums.pb(tt);
- }
- string ans= "0";
- loop(i, 0, (int)sums.size())
- ans = add(ans , sums[i]);
- if(neg % 2) ans.insert(0, 1, '-');
- return ans;
- }
- string sub(string s1, string s2){
- char sign[2] ={'+', '+'};
- if(s1[0] == '-') sign[0] = '-', s1.erase(0, 1);
- if(s2[0] == '-') sign[1] = '-', s2.erase(0, 1);
- if(s1 == s2) return "0";
- int diff = abs((int)s1.size() - (int)s2.size());
- if((int)s2.size() < (int)s1.size())s2.insert(0, diff, '0');
- else if((int)s1.size() < (int)s2.size())s1.insert(0, diff, '0');
- if(s1 < s2) swap(s1, s2), swap(sign[0], sign[1]);
- int carry = 0, sz = s1.size()-1;
- string ans;
- for(int i = sz;i >= 0;i--){
- int d1 = s1[i]-'0', d2 = s2[i] -'0';
- if(d1-d2-carry >= 0) ans+= (d1-d2-carry+'0'), carry = 0;
- else{
- d1 += 10;
- ans += (d1-d2-carry) + '0';
- carry = 1;
- }
- }
- string anss;
- for(int i = (int)ans.size()-1;i >= 0;i--) anss+=ans[i];
- if(sign[0] == '-') anss.insert(0, 1, '-');
- return anss;
- }
- bool compare(string s1, string s2){
- if(s1[0] == '-' && s2[0] != '-') return 0; //-, +
- else if(s1[0] != '-' && s2[0] == '0') return 1; //+, -
- bool neg = 0;
- else if(s1[0] == '-' && s2[0] == '-') neg = 1, s1.erase(0, 1), s2.erase(0, 1);
- int diff = abs((int)s1.size() - (int)s2.size());
- if(s1 > s2) s2.insert(0, diff, '0');
- else if(s2 > s1) s1.insert(0, diff, '0');
- if(!neg)
- s1 > s2 ? return 1:return 0;
- if(neg && s1 < s2)
- s1 < s2 ? return 1:return 0;
- }
- int main() {
- string s1 = "2", s2 = "222222222222222222222222";
- string ans = mul(s1, s2);
- cout << ans <<endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement