简单的高精度除以高精度

该博客探讨了如何高效地进行高精度整数之间的除法运算,旨在求解商和余数。给定两个不超过300位的正整数,博主提供了具体的计算方法和示例输入输出,展示了计算过程。

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 14176 通过数: 6917
【题目描述】
高精除以高精,求它们的商和余数。

【输入】
输入两个低于300位的正整数。

【输出】
输出商和余数。

【输入样例】
1231312318457577687897987642324567864324567876543245671425346756786867867867
1231312318767141738178325678412414124141425346756786867867867
【输出样例】
999999999748590
179780909068307566598992807564736854549985603543237528310337

#include<iostream>
using namespace std;
string s1, s2;
int a[301], b[301], c[301], tmp[301];
int la, lb, lc, lt;//定义长度在外面
void reverseStrtoInt(string src, int* des) {
   
   
	for (int i = 0; i < src.size(); i++) {
   
   
		des[src.size() - i] = src[i] - '0';
	}
}


int move(int B
高精度数值运算中,当需要将一个高精度数值(即超出普通整型变量所能表示范围的数值)除以一个低精度数值(通常为普通整型变量)时,其核心思想是模拟手工除法的过程,并利用数组或字符串等数据结构来存储和操作这些大数。 ### 高精度除以低精度的基本步骤如下: 1. **存储方式** 高精度数值通常以字符串形式输入,然后转换为整型数组进行存储。例如,字符串 `"12345678901234567890"` 可以被拆分为数组 `[0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 7, 6, 5, 4, 3, 2, 1]`(低位在前,高位在后),这样便于后续逐位计算[^1]。 2. **逐位处理与余数传递** 从高精度数值的最高位开始,依次将每一位数字与前一步的余数结合,形成当前被除数。用该数除以低精度数值,得到当前位的商和新的余数。例如: - 假设当前位为 `a`,上一步余数为 `r`,则当前被除数为 `r * 10 + a`。 - 商为 `(r * 10 + a) / b`,新余数为 `(r * 10 + a) % b`,其中 `b` 是低精度除数[^2]。 3. **去除前导零** 在最终结果中,可能会出现前导零的情况,需要手动跳过这些无效零,保留有效的部分作为最终的商。 4. **时间复杂度分析** 因为只需要对高精度数值的每一位进行一次遍历和处理,因此整个过程的时间复杂度为 $ O(n) $,其中 $ n $ 是高精度数值的位数[^2]。 ### 示例代码(C++实现) 以下是一个简单C++ 实现示例,用于演示如何执行高精度数值除以低精度数值的操作: ```cpp #include <iostream> #include <string> #include <vector> using namespace std; // 高精度除以低精度,返回商(字符串形式),remainder 返回余数 string highPrecisionDivide(const string& num, int divisor, int& remainder) { vector<int> result; for (char ch : num) { int current = (remainder * 10) + (ch - '0'); result.push_back(current / divisor); remainder = current % divisor; } // 去除前导零 string quotient; bool leadingZero = true; for (int digit : result) { if (leadingZero && digit == 0) continue; leadingZero = false; quotient += to_string(digit); } return quotient.empty() ? "0" : quotient; // 处理结果为0的情况 } int main() { string num = "12345678901234567890"; int divisor = 123; int remainder = 0; string result = highPrecisionDivide(num, divisor, remainder); cout << "商: " << result << ", 余数: " << remainder << endl; return 0; } ``` ### 关键点总结 - **高精度数值的表示方式**:使用字符串或数组来存储每一位数字,以便处理超长数值。 - **逐位处理机制**:通过逐位处理并维护余数,可以模拟手算除法的过程。 - **效率优化**:由于每次只处理一位且不涉及嵌套循环,时间复杂度保持为线性级别 $ O(n) $,适合大规模数值处理需求[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值