自行体会即可,运用的vector容器存储的数据,理论无限大
进去和出来都要遵循地位在前高位在后
运用到的是运算符的重载功能
不算最快,最快的话要一位存多位,感觉进位问题不太好解决,没有去尝试,欢迎分享
有错误请联系我纠正
高精度加法
//高位在后,低位在前
vector<int> operator +(vector<int>&a,vector<int> &b)
{
if(a.size()<b.size()) return b+a;
std::vector<int> ans;
int t = 0;
for(int i = 0;i < min(a.size(),b.size()+1);i++){
t+=a[i];
if(i<b.size())t+=b[i];
ans.push_back(t%10);
t/=10;
}
if(t)ans.push_back(t);
return ans;
}
高精度减法
//高位在后,低位在前
bool check(vector<int> &a,vector<int> &b)
{
if(a.size()<b.size())return false;
if(a.size()>b.size())return true;
for(int i = a.size()-1;i >=0;i--)
{
if(a[i]==b[i])continue;
else return a[i]>b[i];
}
return true;
}
vector<int> operator -(vector<int> &a,vector<int> &b)
{
if(!check(a,b))
{
//cout<<'-';(视情况而定)
return b - a;
}
std::vector<int> ans;
int t = 0;
for(int i = 0;i < a.size();i++){
t+=a[i];
if(i<b.size())t-=b[i];
ans.push_back((t+10)%10);
if(t<0)t = -1;
else t=0;
}
while(ans[ans.size()-1]==0&&ans.size()>1)ans.pop_back();
if(t)ans.push_back(t);
return ans;
}
高精度乘法(高精乘高精)
//高位在后,低位在前
vector<int> operator *(vector<int> &a,vector<int> &b)
{
std::vector<int> ans(a.size()+b.size(),0);
for(int i = 0;i < a.size();i++)
{
int t = 0;
for(int j = 0; j < b.size();j++)
{
t+=a[i]*b[j];
t+=ans[i+j];
ans[i+j]= t%10;
t/=10;
}
int z = b.size();
if(t)
{
ans[i+z] = t%10;
t/=10;
z++;
}
}
while(ans[ans.size()-1]==0&&ans.size()>1)ans.pop_back();
return ans;
}
高精度乘法(高精乘整形)
//高位在后,低位在前
inline vector<int> operator *(vector<int> &a,ll &b)
{
ll t = 0;
int i = 0;
while(a[i++]==0);
i--;
for (; i < a.size(); ++i)
{
a[i] *= b;
a[i] +=t;
t = a[i]/10;
a[i] %= 10;
}
while(t)
{
a.push_back(t%10);
t/=10;
}
return a;
}
高精度除法(高精除整)
//高位在后,低位在前
vector<int> operator /(vector<int> &a, int b)
{
int r = 0;
std::vector<int> ans;
for(int i = a.size()-1; i >=0; i --)
{
r = r * 10 + a[i]; //计算当前被减数大小
ans.push_back(r / b); //计算当前商的对应位数
r %= b; // 更新余数
}
reverse(ans.begin(), ans.end());
while(ans.size() > 1 && ans.back() == 0) ans.pop_back();
return ans;
}
高精度取模
int operator %(vector<int> &a,int b)
{
int r = 0;
std::vector<int> ans;
for(int i = a.size()-1; i >=0; i --)
{
r = r * 10 + a[i]; //计算当前被减数大小
r %= b; // 更新余数
}
return r;
}
高精度快速幂
//低位在前,高位在后
vector<int> operator *(vector<int> &a,vector<int> &b)
{
vector<int> ans(a.size()+b.size(),0);
int len1 = a.size();
int len2 = b.size();
for(int i = 0;i < a.size();i++)
{
ll t = 0;
for(int j = 0; j < b.size();j++)
{
t+=a[i]*b[j];
t+=ans[i+j];
ans[i+j]= t%10;
t/=10;
}
int z = b.size();
if(t)
{
ans[i+z] = t%10;
t/=10;
z++;
}
}
while(ans.back()==0&&ans.size()>1)ans.pop_back();
return ans;
}
vector<int> operator ^(vector<int> &a,int n)
{
vector<int> ans;
ans.push_back(1);
while(n)
{
if(n&1)
ans = ans *a;
n>>=1;
a= a*a;
}
return ans;
}
高精度阶乘
inline vector<int> operator *(vector<int> &a,ll &b)
{
ll t = 0;
int i = 0;
while(a[i++]==0);
i--;
for (; i < a.size(); ++i)
{
a[i] *= b;
a[i] +=t;
t = a[i]/10;
a[i] %= 10;
}
while(t)
{
a.push_back(t%10);
t/=10;
}
return a;
}
vector<int> jc(ll b,ll c)
{
vector<int>ans;
ans.push_back(1);
ans = ans *b;
while(--b>c)
{
ans = ans*b;
}
return ans;
}