大数运算
vector<int> ls={1,2,3,4,5}
// 代表这个数 为54321 高位存在数组的高位 这样好写代码
加
比如 123456 + 937 关注于6+7 为 13 ,需要上前进一位1 ,本位留下3
模拟这个过程即可4
#include<vector>
#include<iostream>
using namespace std;
void bignum_add(vector<int> & rs,vector<int> &l1,vector<int> &l2)
{
if(l1.size()<l2.size()) bignum_add(rs,l2,l1);
else
{
int t=0;
for(int i=0;i<l1.size()||t;i++)
{
if(i<l1.size()) t+=l1[i];
if(i<l2.size()) t+=l2[i];
rs.push_back(t%10);
t/=10;
}
while(rs.size()>1&&rs.back()==0) rs.pop_back();
}
}
int main()
{
string s1;
string s2;
cin>>s1;
cin>>s2;
vector<int> l1;
vector<int> l2;
for(int i=s1.size()-1;i>=0;i--)
{
l1.push_back(s1[i]-'0');
}
for(int i=s2.size()-1;i>=0;i--)
{
l2.push_back(s2[i]-'0');
}
vector<int> rs;
bignum_add(rs,l1,l2);
for(int i=rs.size()-1;i>=0;i--)
{
cout<<rs[i];
}
}
减
t 表示 从高位借的位 1 或者0
783 -238 比如我们关注3-8 ,会发现不够 ,需要从高位借一位 也就是变成 3-8+10
我们在实现算法的时候,需要保证l1≥l2
#include<vector>
#include<iostream>
using namespace std;
void bignum_add(vector<int> & rs,vector<int> &l1,vector<int> &l2)
{
if(l1.size()<l2.size()) bignum_add(rs,l2,l1);
else
{
int t=0;
for(int i=0;i<l1.size();i++)
{
t+=l1[i];
if(i<l2.size()) t+=l2[i];
rs.push_back(t%10);
t/=10;
}
if(t) rs.push_back(t%10);
while(rs.size()>1&&rs.back()==0) rs.pop_back();
}
}
int cmp(vector<int> &l1,vector<int> &l2)
{
if(l1.size()>l2.size())
{
return 1;
}
else if(l2.size()>l1.size())
{
return 0;
}
else
{
int i=l1.size()-1;// 从高位开始对比
while(l1[i]==l2[i])
{
i--;
}
return i<0?1:l1[i]>l2[i];// 相等返回1 否则会出现-0
}
}
void bignum_del(vector<int> &rs,vector<int> &l1,vector<int> &l2)
{
int t=0;
for(int i=0;i<l1.size();i++)
{
t=l1[i]-t;
if(i<l2.size()) t-=l2[i];
rs.push_back((t+10)%10);
if(t<0) t=1;
else t=0;
}
while(rs.size()>1&&rs.back()==0) rs.pop_back();
}
int main()
{
string s1;
string s2;
cin>>s1;
cin>>s2;
vector<int> l1;
vector<int> l2;
for(int i=s1.size()-1;i>=0;i--)
{
l1.push_back(s1[i]-'0');
}
for(int i=s2.size()-1;i>=0;i--)
{
l2.push_back(s2[i]-'0');
}
vector<int> rs;
if(cmp(l1,l2))
{
bignum_del(rs,l1,l2);
}
else
{
bignum_del(rs,l2,l1);
}
for(int i=rs.size()-1;i>=0;i--)
{
cout<<rs[i];
}
}
乘
一个高精度数乘以一个低精度数
比如 1234 *16
实际上 是 每一位16 我们关注 416 =64 本位留6 同时到3*16的时候 就需要 +6
// 最后剩的t不一定多少,要一点点处理
// 为了统一 加法也采用了这种方法
void bignum_mul(vector<int> &rs,vector<int> &l1,int b)
{
int t=0;
// 123 * 4
// 2
for(int i=0;i<l1.size()||t;i++)
{
if(i<l1.size()) t+=l1[i]*b;
rs.push_back(t%10);
t/=10;
}
while(rs.size()>1&&rs.back()==0) rs.pop_back();
}
int main()
{
string s1;
cin>>s1;
int b=0;
cin>>b;
vector<int> l1;
for(int i=s1.size()-1;i>=0;i--)
{
l1.push_back(s1[i]-'0');
}
vector<int> rs;
bignum_mul(rs,l1,b);
for(int i=rs.size()-1;i>=0;i--)
{
cout<<rs[i];
}
}
除
234除以 3 注意 除法是从高位往后进行除
int bignum_div(vector<int> &rs,vector<int> &l1,int b)
{
int t=0;
for(int i=l1.size()-1;i>=0;i--)
{
t=t*10+l1[i];
rs.push_back(t/b);
t%=b;
}
reverse(rs.begin(),rs.end());
while(rs.size()>1&&rs.back()==0) rs.pop_back();
return t;
}
int main()
{
string s1;
cin>>s1;
int b=0;
cin>>b;
vector<int> l1;
for(int i=s1.size()-1;i>=0;i--)
{
l1.push_back(s1[i]-'0');
}
vector<int> rs;
int t=bignum_div(rs,l1,b);
for(int i=rs.size()-1;i>=0;i--)
{
cout<<rs[i];
}
cout<<endl;
cout<<t;
}