再次学习高精度
高精度加法
需要注意不能返回string&,不能返回vector&
接收的类型必须是string和vector,不能使用&进行接收
#include<cstring>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
string Add(string& a,string& b)
{
string ans;
int t=0;
for(int i=0;i<max(a.size(),b.size())|| t; i++)
{
if(i<a.size()) t+=a[i]-'0';
if(i<b.size()) t+=b[i]-'0';
ans+=t%10+'0';
t/=10;
}
reverse(ans.begin(),ans.end());
return ans;
}
int main()
{
string a,b;
cin>>a>>b;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string ans=Add(a,b);
cout<<ans<<endl;
return 0;
}
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> Add(vector<int>& a,vector<int>& b)
{
vector<int> c;
int t=0;
for(int i=0;i<max(a.size(),b.size());i++)
{
if(i<a.size()) t+=a[i];
if(i<b.size()) t+=b[i];
c.push_back(t%10);
t/=10;
}
reverse(c.begin(),c.end());
return c;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> c,d;
for(int i=a.size()-1;~i;i--) c.push_back(a[i]-'0');
for(int j=b.size()-1;~j;j--) d.push_back(b[j]-'0');
vector<int> ans=Add(c,d);
for(auto n:ans)
printf("%d",n);
return 0;
}
高精度减法
一定要先判断a,b的大小,如果是a小于b,用大减小然后加±号
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string sub(string& a,string& b)
{
//a>=b
string c;
int t=0;//记录借位
int flag=0;//记录是否为负数
for(int i=0;i<a.size();i++)
{
int tem=-t;
tem+=(a[i]-'0');
if(i<b.size()) tem-=b[i]-'0';
if(tem<0) t=1;
else t=0;
c+=(tem+10)%10+'0';
}
while(c.size()>1 && c.back()=='0') c.pop_back();
reverse(c.begin(),c.end());
return c;
}
bool cmp(string& a,string& b)
{
if(a.size()==b.size())
{
for(int i=0;i<a.size();i++)
if(a[i]!=b[i]) return a[i]>b[i];
return true;
}
return a.size()>b.size();
}
int main()
{
string a,b;
cin>>a>>b;
//先判断大小
//如果是边计算便判断大小,那就不符合计算规则了
//计算规则是从个位开始加减,如果a是小于b的,需要用大减小
//不论怎么实现都是需要进行这一步操作的
char c='+';
if(!cmp(a,b))
{
string tem=a;
a=b;
b=tem;
c='-';
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string ans=sub(a,b);
if(c=='-') printf("-");
cout<<ans<<endl;
return 0;
}
高精度乘法
小心12345678*0这种情况,这种情况会出现n个0的情况,我们需要将这些0进行删除
并且要注意string转int需要减去‘0’
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> mul(vector<int>& a,int b)
{
vector<int> c;
int 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();
reverse(c.begin(),c.end());
return c;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int> c;
for(int i=a.size()-1;~i;i--) c.push_back(a[i]-'0');
auto ans=mul(c,b);
for(auto u:ans)
printf("%d",u);
return 0;
}
高精度除法
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
typedef pair<vector<int>,int> PVI;
PVI div(vector<int>& a,int b)
{
vector<int> c;
int t=0;
for(int i=0;i<a.size();i++)
{
t=t*10+a[i];
c.push_back(t/b);
t%=b;
}
reverse(c.begin(),c.end());
while(c.size()>1 && c.back()==0) c.pop_back();
reverse(c.begin(),c.end());
PVI ans({c,t});
return ans;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector<int> c;
for(int i=0;a[i];i++) c.push_back(a[i]-'0');
auto ans=div(c,b);
for(auto u:ans.first)
printf("%d",u);
cout<<endl<<ans.second<<endl;
return 0;
}