高精度算法
详细讲解:https://www.acwing.com/about/ “个人比较推荐 ”
1、使用 auto 时必须将变量赋初始值
2、四则运算所有结果存入c数组中都为倒置数字,故输出时倒序输出
一、加法
要注意最后高位相加可能进位,故循环结束要判断 t 是否为0
#include<iostream>
#include<vector>
using namespace std;
vector<int> add(vector<int> &a,vector<int> &b){//& 可以理解为指针,目的是为了缩短时间
if(a.size()<b.size()) return add(b,a);
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++){
t+=a[i];
if(i<b.size()) t+=b[i];
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(t);
return c;
}
int main(){
vector<int> a,b;
string str1,str2;
cin>>str1>>str2;
for(int i=str1.size()-1;i>=0;i--) a.push_back(str1[i]-'0');
for(int i=str2.size()-1;i>=0;i--) b.push_back(str2[i]-'0');
auto c=add(a,b);
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
return 0;
}
二、减法
要注意比较两数的大小,要保持大数减小数,正负在运算之前已经判断出来了
运算结束注意去前导0,c 数组长度始终大于等于 1 防止结果为本身为0
#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> c;
int t=0;
for(int i=0;i<a.size();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;
}
int main(){
vector<int> a,b;
string str1,str2;
cin>>str1>>str2;
for(int i=str1.size()-1;i>=0;i--) a.push_back(str1[i]-'0');
for(int i=str2.size()-1;i>=0;i--) b.push_back(str2[i]-'0');
vector<int> c;
if(cmp(a,b)) c=sub(a,b);
else c=sub(b,a),cout<<'-';
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
return 0;
}
三、乘法
去前导0时,应考虑到结果为0,故c数组长度大于等于1
#include<iostream>
#include<vector>
using namespace std;
vector<int> che(vector<int>&a,int b){
vector<int> c;
long long t=0;
for(int i=0;i<a.size() || t ;i++){
if(i<a.size()) t+=a[i]*b;
c.push_back(t%10);
t/=10;
}
while(c.size()>1 && c.back()==0) c.pop_back();
return c;
}
int main(){
vector<int> a;
int b;
string str1;
cin>>str1>>b;
for(int i=str1.size()-1;i>=0;i--) a.push_back(str1[i]-'0');
auto c=che(a,b);
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
return 0;
}
四、除法
除法不同于前三种,c数组本身就是结果,但是会有前导0,故先将数组c倒置删除数组末尾的0(仍要注意结果本身为0)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> chu(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];
c.push_back(r/b);
r%=b;
}
reverse(c.begin(),c.end());//左闭右开
while(c.back()==0&&c.size()>1) c.pop_back();//去掉前导0
return c;
}
int main(){
int b;
vector<int> a;//int a[N]
string str;
cin>>str>>b;
for(int i=str.size()-1;i>=0;i--) a.push_back(str[i]-'0');
int r=0;
auto c=chu(a,b,r);
for(int i=c.size()-1;i>=0;i--) cout<<c[i];
cout<<endl<<r<<endl;
return 0;
}