高精度算法

目录

高精度加法

代码说明:

高精度加法(整数)

高精度加法(浮点数)

高精度加法(含符号)

高精度减法

代码说明:

高精度减法(整数)

高精度减法(浮点数)

高精度乘法

代码说明:

高精度乘法(整数)

高精度乘法(浮点数)

高精度除法

高精度除法(整数)

高精度除法(浮点数)

代码说明:


高精度加法

代码说明:

  1. 高精度加法(整数)

    • 首先确保两个字符串长度相等,较短的字符串在前面补零。

    • 从最低位开始逐位相加,并处理进位。

    • 最后反转结果字符串得到正确的顺序。

  2. 高精度加法(浮点数)

    • 将浮点数分为整数部分和小数部分。

    • 分别对整数部分和小数部分进行高精度加法。

    • 处理小数部分相加后可能产生的进位。

    • 最后合并整数部分和小数部分得到最终结果。

高精度加法(整数)

cpp 复制代码
// 高精度加法(整数)
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;
}

高精度加法(浮点数)

cpp 复制代码
// 高精度加法(浮点数)
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;
}

高精度加法(含符号)

负号使用高精度减法, 正好使用高精度加法(可选择有无符号)

高精度减法

代码说明:

  1. 整数减法

    • 处理大整数减法,确保 ,否则交换并标记结果为负数。

    • 反转字符串,从最低位开始逐位相减,处理借位。

    • 去掉前导零并返回结果。

  2. 浮点数减法

    • 补齐小数部分长度,确保两个数的小数位数相同。

    • 移除小数点,将浮点数视为整数进行减法运算。

    • 重新插入小数点并去掉多余的零。

高精度减法(整数)

cpp 复制代码
// 高精度减法(整数)
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;
}

高精度减法(浮点数)

cpp 复制代码
// 补齐小数部分长度
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;
}

高精度乘法

代码说明:

  1. 高精度整数乘法

    • 使用字符串表示大整数。

    • 通过逐位相乘并处理进位来实现乘法。

    • 最后去除前导零并返回结果。

  2. 高精度浮点数乘法

    • 首先找到小数点的位置,将浮点数转换为整数。

    • 计算小数点的总位数。

    • 使用整数乘法进行计算。

    • 最后根据小数点的位数插入小数点。

高精度乘法(整数)

cpp 复制代码
// 高精度整数乘法
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;
}

高精度乘法(浮点数)

cpp 复制代码
// 高精度浮点数乘法
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;
}

高精度除法

高精度除法(整数)

cpp 复制代码
// 高精度整数除法
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;
}

高精度除法(浮点数)

cpp 复制代码
// 高精度浮点数除法
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;
}

代码说明:

  1. 高精度整数除法

    • highPrecisionDivide 函数实现了高精度整数除法。它通过逐位处理被除数,模拟手工除法的过程。

    • 该函数返回一个字符串形式的结果。

  2. 高精度浮点数除法

    • highPrecisionFloatDivide 函数首先将浮点数分为整数部分和小数部分。

    • 对整数部分调用 highPrecisionDivide 进行除法运算。

    • 对小数部分进行逐位处理,模拟手工除法的过程,直到达到指定的精度。

相关推荐
Dizzy.51716 分钟前
数据结构(查找)
数据结构·学习·算法
专注VB编程开发20年2 小时前
除了 EasyXLS,加载和显示.xlsx 格式的excel表格,并支持单元格背景色、边框线颜色和粗细等格式化特性
c++·windows·excel·mfc·xlsx
分别努力读书3 小时前
acm培训 part 7
算法·图论
武乐乐~3 小时前
欢乐力扣:赎金信
算法·leetcode·职场和发展
'Debug3 小时前
算法从0到100之【专题一】- 双指针第一练(数组划分、数组分块)
算法
Fansv5874 小时前
深度学习-2.机械学习基础
人工智能·经验分享·python·深度学习·算法·机器学习
夏天的阳光吖4 小时前
C++蓝桥杯基础篇(四)
开发语言·c++·蓝桥杯
oioihoii4 小时前
C++17 中的 std::to_chars 和 std::from_chars:高效且安全的字符串转换工具
开发语言·c++
张胤尘4 小时前
C/C++ | 每日一练 (2)
c语言·c++·面试
強云5 小时前
23种设计模式 - 装饰器模式
c++·设计模式·装饰器模式