江门市住房和城乡建设局网站站长工具天美传媒
目录
高精度加法
代码说明:
高精度加法(整数)
高精度加法(浮点数)
高精度加法(含符号)
高精度减法
代码说明:
高精度减法(整数)
高精度减法(浮点数)
高精度乘法
代码说明:
高精度乘法(整数)
高精度乘法(浮点数)
高精度除法
高精度除法(整数)
高精度除法(浮点数)
代码说明:
高精度加法
代码说明:
-
高精度加法(整数):
-
首先确保两个字符串长度相等,较短的字符串在前面补零。
-
从最低位开始逐位相加,并处理进位。
-
最后反转结果字符串得到正确的顺序。
-
-
高精度加法(浮点数):
-
将浮点数分为整数部分和小数部分。
-
分别对整数部分和小数部分进行高精度加法。
-
处理小数部分相加后可能产生的进位。
-
最后合并整数部分和小数部分得到最终结果。
-
高精度加法(整数)
// 高精度加法(整数)
string addBigInt(string num1, string num2) {// 确保num1是较长的字符串if (num1.length() < num2.length()) {swap(num1, num2);}// 补零使两个字符串长度相等while (num2.length() < num1.length()) {num2 = '0' + num2;}string result;int carry = 0;for (int i = num1.length() - 1; i >= 0; --i) {int digit1 = num1[i] - '0';int digit2 = num2[i] - '0';int sum = digit1 + digit2 + carry;carry = sum / 10;result.push_back((sum % 10) + '0');}// 如果最后还有进位if (carry) {result.push_back(carry + '0');}// 反转结果字符串reverse(result.begin(), result.end());return result;
}
高精度加法(浮点数)
// 高精度加法(浮点数)
string addBigFloat(string num1, string num2) {// 分离整数部分和小数部分size_t dot1 = num1.find('.');size_t dot2 = num2.find('.');string intPart1 = (dot1 == string::npos) ? num1 : num1.substr(0, dot1);string fracPart1 = (dot1 == string::npos) ? "" : num1.substr(dot1 + 1);string intPart2 = (dot2 == string::npos) ? num2 : num2.substr(0, dot2);string fracPart2 = (dot2 == string::npos) ? "" : num2.substr(dot2 + 1);// 补零使小数部分长度相等while (fracPart1.length() < fracPart2.length()) {fracPart1.push_back('0');}while (fracPart2.length() < fracPart1.length()) {fracPart2.push_back('0');}// 小数部分相加string fracSum = addBigInt(fracPart1, fracPart2);int carry = 0;if (fracSum.length() > fracPart1.length()) {carry = 1;fracSum = fracSum.substr(1);}// 整数部分相加string intSum = addBigInt(intPart1, intPart2);if (carry) {intSum = addBigInt(intSum, "1");}// 合并整数部分和小数部分return intSum + "." + fracSum;
}
高精度加法(含符号)
负号使用高精度减法, 正好使用高精度加法(可选择有无符号)
高精度减法
代码说明:
-
整数减法:
-
处理大整数减法,确保
,否则交换并标记结果为负数。
-
反转字符串,从最低位开始逐位相减,处理借位。
-
去掉前导零并返回结果。
-
-
浮点数减法:
-
补齐小数部分长度,确保两个数的小数位数相同。
-
移除小数点,将浮点数视为整数进行减法运算。
-
重新插入小数点并去掉多余的零。
-
高精度减法(整数)
// 高精度减法(整数)
string subtractBigIntegers(string num1, string num2) {// 确保 num1 >= num2,否则交换并标记结果为负数bool negative = false;if (num1.length() < num2.length() || (num1.length() == num2.length() && num1 < num2)) {swap(num1, num2);negative = true;}// 反转字符串以便从最低位开始计算reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());string result;int carry = 0;for (int i = 0; i < num1.length(); ++i) {int digit1 = num1[i] - '0';int digit2 = (i < num2.length()) ? (num2[i] - '0') : 0;int diff = digit1 - digit2 - carry;if (diff < 0) {diff += 10;carry = 1;} else {carry = 0;}result.push_back(diff + '0');}// 去掉前导零while (result.length() > 1 && result.back() == '0') {result.pop_back();}// 反转回正常顺序reverse(result.begin(), result.end());// 如果结果为负数,添加负号if (negative) {result = "-" + result;}return result;
}
高精度减法(浮点数)
// 补齐小数部分长度
void padDecimal(string &num1, string &num2) {size_t dot1 = num1.find('.');size_t dot2 = num2.find('.');if (dot1 == string::npos) num1 += ".0";if (dot2 == string::npos) num2 += ".0";size_t decimal1 = num1.length() - num1.find('.') - 1;size_t decimal2 = num2.length() - num2.find('.') - 1;if (decimal1 < decimal2) {num1.append(decimal2 - decimal1, '0');} else if (decimal1 > decimal2) {num2.append(decimal1 - decimal2, '0');}
}// 高精度减法(浮点数)
string subtractBigFloats(string num1, string num2) {// 补齐小数部分padDecimal(num1, num2);// 移除小数点,将浮点数视为整数size_t dot1 = num1.find('.');size_t dot2 = num2.find('.');num1.erase(dot1, 1);num2.erase(dot2, 1);// 调用整数减法string result = subtractBigIntegers(num1, num2);// 重新插入小数点int decimalPlaces = max(num1.length() - dot1, num2.length() - dot2);result.insert(result.length() - decimalPlaces, ".");// 去掉末尾多余的零result.erase(result.find_last_not_of('0') + 1, string::npos);if (result.back() == '.') result.pop_back();return result;
}
高精度乘法
代码说明:
-
高精度整数乘法:
-
使用字符串表示大整数。
-
通过逐位相乘并处理进位来实现乘法。
-
最后去除前导零并返回结果。
-
-
高精度浮点数乘法:
-
首先找到小数点的位置,将浮点数转换为整数。
-
计算小数点的总位数。
-
使用整数乘法进行计算。
-
最后根据小数点的位数插入小数点。
-
高精度乘法(整数)
// 高精度整数乘法
string multiply(string num1, string num2) {int n1 = num1.size();int n2 = num2.size();vector<int> result(n1 + n2, 0);// 从低位到高位逐位相乘for (int i = n1 - 1; i >= 0; i--) {for (int j = n2 - 1; j >= 0; j--) {int mul = (num1[i] - '0') * (num2[j] - '0');int sum = mul + result[i + j + 1];result[i + j + 1] = sum % 10;result[i + j] += sum / 10;}}// 去除前导零int i = 0;while (i < result.size() && result[i] == 0) {i++;}// 将结果转换为字符串string res;for (; i < result.size(); i++) {res.push_back(result[i] + '0');}return res.empty() ? "0" : res;
}
高精度乘法(浮点数)
// 高精度浮点数乘法
string multiplyFloat(string num1, string num2) {// 找到小数点的位置size_t dot1 = num1.find('.');size_t dot2 = num2.find('.');// 如果没有小数点,则当作整数处理if (dot1 == string::npos) dot1 = num1.size();if (dot2 == string::npos) dot2 = num2.size();// 移除小数点,将浮点数转换为整数string int1 = num1.substr(0, dot1) + num1.substr(dot1 + 1);string int2 = num2.substr(0, dot2) + num2.substr(dot2 + 1);// 计算小数点的总位数int decimalPlaces = (num1.size() - dot1 - 1) + (num2.size() - dot2 - 1);// 进行整数乘法string result = multiply(int1, int2);// 插入小数点if (decimalPlaces > 0) {result.insert(result.size() - decimalPlaces, ".");}return result;
}
高精度除法
高精度除法(整数)
// 高精度整数除法
string highPrecisionDivide(string dividend, int divisor) {string result;int index = 0;int temp = dividend[index] - '0';while (temp < divisor) {temp = temp * 10 + (dividend[++index] - '0');}while (dividend.size() > index) {result += (temp / divisor) + '0';temp = (temp % divisor) * 10 + (dividend[++index] - '0');}if (result.length() == 0) {return "0";}return result;
}
高精度除法(浮点数)
// 高精度浮点数除法
string highPrecisionFloatDivide(string dividend, int divisor, int precision) {size_t decimalPoint = dividend.find('.');if (decimalPoint == string::npos) {decimalPoint = dividend.length();}string integerPart = dividend.substr(0, decimalPoint);string fractionalPart = dividend.substr(decimalPoint + 1);string integerResult = highPrecisionDivide(integerPart, divisor);string fractionalResult;int temp = 0;for (int i = 0; i < fractionalPart.length(); ++i) {temp = temp * 10 + (fractionalPart[i] - '0');}for (int i = 0; i < precision; ++i) {temp *= 10;fractionalResult += (temp / divisor) + '0';temp %= divisor;}return integerResult + "." + fractionalResult;
}
代码说明:
-
高精度整数除法:
-
highPrecisionDivide 函数实现了高精度整数除法。它通过逐位处理被除数,模拟手工除法的过程。
-
该函数返回一个字符串形式的结果。
-
-
高精度浮点数除法:
-
highPrecisionFloatDivide 函数首先将浮点数分为整数部分和小数部分。
-
对整数部分调用 highPrecisionDivide 进行除法运算。
-
对小数部分进行逐位处理,模拟手工除法的过程,直到达到指定的精度。
-