文章目录
794. 高精度除法
题目描述
给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。
输入格式
共两行,第一行包含整数 A,第二行包含整数 B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000,
1≤B≤10000,
B 一定不为 0
输入样例:
7
2
输出样例:
3
1
高精度除法
// 包含了常用的头文件
#include<bits/stdc++.h>
using namespace std;
// div函数用于计算高精度的除法,其中a是被除数(以每位的vector<int>形式存储),b是除数,r是用于返回余数的引用
vector<int> div(vector<int>& a,int b,int& r){
vector<int> c; // 用于存储商的每一位
r = 0; // 初始化余数为0
// 从最高位到最低位遍历被除数
for(int i=a.size()-1;i>=0;i--){
r = r*10 + a[i]; // 计算当前的被除数值(包括之前的余数)
c.push_back(r / b); // 计算当前位的商,并添加到结果vector中
r %= b; // 更新余数
}
// 由于是从最高位开始计算的,所以最后需要将结果反转,以符合正常的数位顺序
reverse(c.begin(), c.end());
// 移除结果中的前导0,除非最终结果就是0,否则不应该有前导0
while(c.size() > 1 && c.back() == 0) c.pop_back();
return c; // 返回商的结果
}
// main函数是程序的入口
int main(){
string a; // 用于接收字符串形式的被除数A
int b; // 用于接收整数形式的除数B
cin >> a >> b; // 从标准输入读取被除数和除数
vector<int> A; // 用于存储被除数的每一位数字
// 从字符串末尾开始,即个位开始向vector中添加数字,这样vector的第0位就是最低位
for(int i=a.size()-1; i>=0; i--)
A.push_back(a[i] - '0');
int r; // 用于存储余数
auto c = div(A, b, r); // 调用div函数计算商和余数
// 输出商,由于商可能被去除了前导0,直接顺序输出即可
for(int i=c.size()-1; i>=0; i--)
cout << c[i];
printf("\n%d", r); // 输出余数
return 0;
}
这个程序按照下面的步骤执行:
- 从标准输入读取被除数
A
(字符串形式)和除数B
。 - 将被除数
A
的每一位数字存储到一个vector<int>
中,存储时将字符串倒序,使得vector的第0位表示最低位。 - 调用
div
函数计算商和余数,其中商以vector<int>
的形式返回,余数通过引用返回。 - 将计算获得的商输出,注意商可能没有前导0。
- 输出计算得到的余数。
特别注意,这个程序可以处理非常大的被除数,因为它将被除数作为字符串处理,逐位计算除法。这种方法避免了因为被除数过大而导致的整数溢出问题。