加
// C = A + B, A >= 0, B >= 0
string add(const string &A, const string &B)
{
vector<int> a, b, c;
for (auto iter = A.rbegin(); iter != A.rend(); iter++)
a.push_back(*iter - '0');
for (auto iter = B.rbegin() - 1; iter != B.rend(); iter++)
b.push_back(*iter - '0');
int t = 0;
for (size_t i = 0; i < a.size() || i < b.size(); i++)
{
if (i < a.size())
t += a[i];
if (i < b.size())
t += b[i];
c.push_back(t % 10);
t /= 10;
}
if (t)
c.push_back(1);
string C;
for (auto iter = c.end() - 1; iter != c.begin() - 1; iter--)
C.push_back(*iter + '0');
return C;
}
减
// C = A - B, A >= 0, B >= 0
string sub(const string &A, const string &B)
{
bool flag = A.size() < B.size(); //判断A<B?
if (A.size() == B.size())
flag = A < B;
if (flag)
return "-" + sub(B, A);
else
{
vector<int> a, b, c;
for (auto iter = A.end() - 1; iter != A.begin() - 1; iter--)
a.push_back(*iter - '0');
for (auto iter = B.end() - 1; iter != B.begin() - 1; iter--)
b.push_back(*iter - '0');
int t = 0;
for (size_t i = 0; i < a.size(); i++)
{
t += a[i];
if (i < b.size())
t -= b[i];
c.push_back((t + 10) % 10);
t = t < 0 ? -1 : 0;
}
while (c.size() > 1 && c.back() == 0)
c.pop_back();
string C;
for (auto iter = c.end() - 1; iter != c.begin() - 1; iter--)
C.push_back(*iter + '0');
return C;
}
}
乘
这里直接做的卷积运算,推荐用FFT速度更快
// C = A * B, A >= 0, B >= 0
string multiply(const string &A, const string &B) {
int L1=A.size(), L2=B.size();
vector<int> s1,s2;
for(int i = L1-1; i>=0; i--) s1.push_back(A[i]-'0');
for(int i = L2-1; i>=0; i--) s2.push_back(B[i]-'0');
vector<int> C(L1+L2,0);
for(int i = 0; i<L1; i++){
for(int j = 0; j<L2; j++){
C[i+j] += s1[i]*s2[j];
}
}
for (int i = 0, t = 0; i < C.size(); i ++ ) {
t += C[i];
C[i] = t % 10;
t /= 10;
}
int k = C.size()-1;
while(k && !C[k]) k--;
string ans;
for(int i = k; i >= 0; i--){
ans += C[i] + '0';
}
return ans;
}
除(大数除小数)
// A / b = C , A >= 0, b > 0
string div(const string &A,int b){
vector<int> a, c;
for (auto iter = A.begin(); iter != A.end(); iter++)
a.push_back(*iter - '0');
int r = 0;
for (size_t i = 0; i < A.size(); i ++ )
{
r = r * 10 + a[i];
c.push_back(r / b);
r %= b;
}
while (c.size() > 1 && c.front() == 0) c.erase(c.begin());
string C;
for (auto iter = c.begin(); iter != c.end(); iter++)
C.push_back(*iter + '0');
return C;
}