高精*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;}
}