高精*int
string div(string sa, int b) {
int la = sa.length(), x = 0;
for (int i = 0; i < la; i++) {
a[i + 1] = sa[i] - '0';
}
for (int i = 1; i <= la; i++) {
c[i] = (x * 10 + a[i]) / b;
x = (x * 10 + a[i]) % b;
}
int lc = 1;
while (c[lc] == 0 && lc < la) lc++;
string s;
for (int i = lc; i <= la; i++) {
s += char(c[i] + '0');
}
return s;
}
高精/高精
string multiply(const string& num1, const string& num2) {
string result(num1.size() + num2.size(), '0');
int len1 = num1.size(), len2 = num2.size();
for (int i = len1 - 1; i >= 0; --i) {
int carry = 0;
int n1 = num1[i] - '0';
for (int j = len2 - 1; j >= 0; --j) {
int sum = result[i + j + 1] - '0' + n1 * (num2[j] - '0') + carry;
result[i + j + 1] = char(sum % 10 + '0');
carry = sum / 10;
}
if (carry) {
result[i] = char(carry + '0');
}
}
size_t pos = result.find_first_not_of('0');
return (pos == string::npos) ? "0" : result.substr(pos);
}
高精+高精
string add(string a, string b) {
string c;
int x = 0;
int i = a.size() - 1;
int j = b.size() - 1;
while (i >= 0 || j >= 0 || x) {
int sum = x;
if (i >= 0) sum += a[i--] - '0';
if (j >= 0) sum += b[j--] - '0';
c+=((sum % 10) + '0');
x = sum / 10;
}
reverse(c.begin(), c.end());
return c;
}
高精-高精
string subtract(string n1, string n2) {
string ans = "";
int c = 0;
reverse(n1.begin(), n1.end());
reverse(n2.begin(), n2.end());
for (int i = 0; i < n1.length(); i++) {
int d1 = n1[i] - '0';
int d2 = (i < n2.length()) ? (n2[i] - '0') : 0;
int d = d1 - d2 - c;
if (d < 0) {
d += 10;
c = 1;
} else {
c = 0;
}
ans += (d + '0');
}
while (ans.length() > 1 && ans.back() == '0') {
ans.pop_back();
}
reverse(ans.begin(),ans.end());
return ans;
}
高精/高精
// 大整数加法
string add(string n1, string n2) {
string ans = "";
int c = 0;
reverse(n1.begin(), n1.end());
reverse(n2.begin(), n2.end());
int mxlen = max(n1.length(), n2.length());
for (int i = 0; i < mxlen; i++) {
int d1 = (i < n1.length()) ? (n1[i] - '0') : 0;
int d2 = (i < n2.length()) ? (n2[i] - '0') : 0;
int s = d1 + d2 + c;
c = s / 10;
ans += (s % 10) + '0';
}
if (c > 0) ans += c + '0';
reverse(ans.begin(), ans.end());
while (ans.length() > 1 && ans.back() == '0') {
ans.pop_back();
}
return ans;
}
// 大整数乘法
string multiply(string n1, string n2) {
string ans = "0";
reverse(n1.begin(), n1.end());
for (int i = 0; i < n2.length(); i++) {
int c = 0;
string t;
char d2 = n2[n2.length() - 1 - i];
if (d2 == '0') {
t += '0';
continue;
}
for (int j = 0; j < n1.length(); j++) {
int d1 = n1[j] - '0';
int p = d1 * (d2 - '0') + c;
c = p / 10;
t += (p % 10) + '0';
}
if (c > 0) t += c + '0';
for (int k = 0; k < i; k++) {
t += '0';
}
string s = add(ans, t);
ans = s;
}
return ans;
}
d1/d2保留小数点后d3位
void divide(int d1, int d2, int d3) {
cout << d1 / d2 << '.';
int r = d1 % d2;
for (int i = 0; i < d3; i++) {
r *= 10;
cout << r / d2;
r %= d2;
}
}