高精度除法:模拟除的过程 得被除数(第一步不用得直接拿来)->得商->得余数 别忘删前导零
高精度除高精度:用减法代替除法
先判断A>B 大的话最高位减 不能减了之后再加后面的位 直到所有位都减过了 注意j(b的位数)的变化 以及结果的高位低位 去除前导零
vector assign函数用法 (n,m)n个数值为m的数赋值给vector
或者把(first,end )左开右闭范围内的数据赋值给vector
代码来源:https://www.acwing.com/solution/content/39062/
高精度除低精度
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> div(vector<int>& a,int& b,int& r){
vector<int> res;
for(int i = a.size()-1;i>=0;--i){
r=r*10+a[i];
res.push_back(r/b);
r%=b;
}
reverse(res.begin(),res.end());
while(res.size()>1&&res.back()==0)res.pop_back();
return res;
}
int main(){
string a;
int b;
cin>>a>>b;
vector<int> A,res;
for(int i = a.size()-1;i>=0;--i)A.push_back(a[i]-'0');
int r = 0;
res = div(A,b,r);
for(int i = res.size()-1;i>=0;--i)printf("%d",res[i]);
printf("\n");
printf("%d",r);
return 0;
}
高精度除高精度
#include<algorithm>
#include<iostream>
#include<vector>
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> res;
for(int i = 0,t = 0;i<a.size();i++){
t = a[i] - t;
if(i<b.size())t-=b[i];
res.push_back((t+10)%10);
if(t>=0)t = 0;
else t = 1;
}
while(res.size()>1&&res.back()==0)res.pop_back();
return res;
}
vector<int> div(vector<int>& a,vector<int>& b,vector<int>& r){
vector<int> res;
if (!cmp(a, b)) {
res.push_back(0);
r.assign(a.begin(), a.end());
return res;
}
int j = b.size();
r.assign(a.end()-j,a.end());
while(j<=a.size()){
int k = 0;
while(cmp(r,b)){
r = sub(r,b);
++k;
}
res.push_back(k);
if(j<a.size())r.insert(r.begin(),a[a.size()-j-1]);
++j;
while(r.size()>1&&r.back()==0)r.pop_back();
}
reverse(res.begin(),res.end());
while(res.size()>1&&res.back()==0)res.pop_back();
return res;
}
int main(){
string a,b;
vector<int> A,B,r;
cin>>a>>b;
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');
vector<int> res;
res = div(A,B,r);
for(int i = res.size()-1;i>=0;--i)printf("%d",res[i]);
printf("\n");
for(int i = r.size()-1;i>=0;--i)printf("%d",r[i]);
return 0;
}