--- title: "高精度除法" created: 2025-11-28 tags: - 算法 --- # 高精度除法 ## 题目 [高精度除法](https://www.acwing.com/problem/content/796/) ![[image-a76a93dd.png]] ## 思路分析 ![[image-d532ccea.png]] 与之前不同 这里从高位开始算 每位等于(前一位除以x的余数\*10 +当前位)除以 x 留给下一位的就是这个 (前一位除以x的余数\*10 +当前位)模上x ## 代码实现 ```cpp #include using namespace std; //除法的话正着存其实会更好算些 但是因为这种高精度的计算要出现的话往往是同时出现 //所以为了统一 对于除法也用这种逆序储存 //123/3 //1/3=0 余1 //1*10+2 /3 =12 余0 //0*3+3 /3 =1 余0 //结果为41 余0 //注意的是 与加减乘不同 除是从高位开始算的 //每轮的被除数都是前轮的余数*10+当前位的数 //结果就是/b //余数就是%b //捋清楚其实也是很简单的一个循环 //最后要注意的就是 因为刚开始是从高位开始算的 而结果是push_back进去的 所以最后要反转一下C //别忘了取出前导0的问题 vector div(vector &A,int b,int &r) { vector 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()); while(C.size()>1 && C.back()==0) C.pop_back(); return C; } int main() { string a; int b; cin>>a>>b; vector 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--) printf("%d",C[i]); cout<