前言
这里也是一个高精度的整数除以一个低精度的整数,我们先来看人是如何相除两个数的,请看下图
但是计算机不知道要从第二位开始除,所以不管如何就从第一位开始除,如下图
我们可以知道是有余数的,这一过程可以公式化,例如(上一位的余数*10+第一位)/b 就是商的第一位,第一位%b 就是第一位的余数,将第一位的余数*b加上下一位,第一位的余数*b加上下一位 /b就是商的第二位......以此类推,直到求完了被除数的最后一位,我们知道第一次循环时上一位的余数是0.
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector <int> div(vector<int>& A, int b, int &r)
{
vector<int> C;
r = 0;
for (int i = A.size() - 1; i >= 0; i--)
{
r = r * 10 + A[i]; //这一位的数为 上一位的余数*10 + 这一位
C.push_back(r / b);
r = r % b;
}
reverse(C.begin(), C.end()); //逆序数组,reverse()的头文件是<algorithm>
//如果不逆序,那么会出现100/3 ---> 033 1
while (C.size() > 1 && C.back() == 0) //去前导0
C.pop_back();
return C;
}
int main(void)
{
string a;
vector <int> A;
int b;
cin >> a >> b;
int r = 0; //余数
for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
auto C=div(A, b, r);
for (int i = 0; i < C.size(); i++)
{
printf("%d", C[i]);
}
printf("\n%d", r);
return 0;
}