AcWing 794. 高精度除法
1、题目(来源于AcWing):
给定两个非负整数A,B,请你计算 A / B的商和余数。
输入格式
共两行,第一行包含整数A,第二行包含整数B。
输出格式
共两行,第一行输出所求的商,第二行输出所求余数。
数据范围
1≤A的长度≤100000,
1≤B≤10000
B 一定不为0
输入样例:
7
2
输出样例:
3
1
2、基本思想:
适用于一个高精度整数除以一个低精度整数,将高精度整数的每一位存入一个大数组,从高位开始进行传统的人工除法,每次的余数用r表示。
3、步骤:
①将被除数存入一个大数组(数据比较大,不能用int)
②写一个函数进行人工除法
③正序输出商
4、C++代码如下(该代码引用AcWing网站的代码):
#include <iostream>
#include <vector>
#include <algorithm>//包含reverse
using namespace std;
vector<int> div(vector<int> &A, int b, int &r);
int main()
{
string a;
int b;
cin >> a >> b;
vector<int> A;
for (int i = a.size()-1; i>=0; i--) A.push_back(a[i] - '0');
int r;
auto C = div(A, b, r);
for (int i = C.size()-1; i>=0; i--) cout << C[i];
cout << endl << r << endl;//余数r前后输出回车
return 0;
}
vector<int> div(vector<int> &A, int b, int &r)//余数r要引用
{
vector<int> C;//商C
r = 0;
for (int i=A.size()-1; i>=0; i--)//除法是从高位开始算,所以这里与加减乘都不一样
{
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
}
reverse(C.begin(), C.end());//上面C是正序存入的,主函数中又颠倒了一遍,所以这里要逆序
while (C.size() > 1 && C.back() == 0) C.pop_back();//清除前导0
return C;
}//该代码引用AcWing网站的代码
注意事项:
①进行除法时,从高位开始比较容易,但是一般情况是加减乘除混合,所以为了迎合加减乘的写法,这里依然是倒序存储被除数,但是运算时就要从高位最先开始访问。
②注意在除法函数中要保持商的倒序
③清除前导0
④函数中余数 r 要引用