高精度除法
思路分析
本题是高精度除以低精度,求商和余数,主要思路依旧是模拟手工
手算时候,是从高位往低位,每次是余数末位补数字接着往下除
本题目依旧存在前导0的问题,后面要处理一下
每次除法,余数末位补一个数字(也就是 * 10 + 高精度本位)求商
求前导0时,由于我们是从高位往地位除,答案也是从高位往地位写的
所以需要先倒置容器,最后去除后面的0,然后得到答案
代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> div(vector<int> &A, int b, int &r)//引用r,确保改变实参,引用A,是提高效率减少拷贝
{
vector<int> C;
r = 0;//记得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());//倒置
while (C.size() > 1 && C.back() == 0) C.pop_back();//去前导0
return C;
}
int main()
{
string a;
vector<int> A;
int B;
cin >> a >> B;
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;
return 0;
}
一个尴尬的问题
我发现我写的题解,并不适合不会的人,初学者很难通过看我的题解学会题
不过,我发现用它去复习还是很不错的,就是懂了但是没完全懂的时候看我的题解会比较好
第一轮先就按y总走,后续应该还有一轮添加,比如本题目,压位做法也写一下之类的