A / B
通过使用sub减操作来完成两个大整数的除法
样例
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(vector<int> &A, vector<int> &B){
if(A.size()!=B.size()) return A.size()>B.size();
for(int i=A.size()-1;i>=0;i--){
if(A[i]!=B[i]) return A[i]>B[i];
}
return true;
}
vector<int> sub(vector<int> &A,vector<int> &B){
vector<int> C;
int t=0;
for(int i=0;i<A.size()||t;i++){
t = A[i] - t;
if(i<B.size()) t -= B[i];
C.push_back((t+10)%10);
if(t<0) t = 1;
else t = 0;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
vector<int> div(vector<int> &A, vector<int> &B, vector<int> &r){
vector<int> C;
int j = B.size();
r.assign(A.end()-j,A.end());
while(j<=A.size()){
int k=0;
while(cmp(r,B)){
vector<int> s = sub(r,B);
r.clear();
r.assign(s.begin(),s.end());
k++;
}
C.push_back(k);
if(j<A.size()) r.insert(r.begin(),A[A.size()-j-1]);
if(r.size()>1&&r.back()==0) r.pop_back();
j++;
}
reverse(C.begin(),C.end());
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main(){
string a,b;
cin>>a>>b;
vector<int> A,B,r;
for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
auto C = div(A,B,r);
for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
printf("\n");
for(int i=r.size()-1;i>=0;i--) printf("%d",r[i]);
return 0;
}
div
函数里面循环减法求商,为什么每次要把r清零再赋新值呢,测试了一下改成也可以AC
加强数据后在div函数中的
vector<int> C;
后面加入这行代码就可以了if(!cmp(A,B)){ C.push_back(0); r.assign(A.begin(),A.end()); return C; }
大佬牛啊,必须支持,这就是拓展啊,以后考高精除高精也不怕了
哈哈哈,来考古了
div函数中
j++
上面为什么要加if
判断去除前导0,两数减法模拟除法在相减的时候不是已经删去前导0了吗?我也觉得是这样 hhh 不知道为啥去了会报错
能讲下算法思路吗,蒟蒻看不懂(/∇\)
感谢大佬
佬,数据加强了,8除17WA了
佬,代码我将A小于B的情况添加进去完善好了,已经可以AC了
佬的A大于等于B的代码属实牛的,完全正确
牛逼
高精除高精nice
赞一个
这个代码好像有一点点的小bug......如果输入20和400,答案就不太对..
我测试了一下 答案是0和20 没错吧
没错没错....因为我写了个加减乘除的结合版,我的结合版错了555
好的好的
在div函数的第二行多加这个代码:
//边界条件A<B
if(!cmp(A,B)){
C.push_back(0);
r=A;
return C;
}
妙啊!!太妙了!!!收藏了收藏了,谢谢大佬!
嘿嘿 有用就行 如果有错误还请指正