高精度算法
通常,我们在处理问题的时候,很多的数据并不像我们所熟知的int 和long long一样,很容易的能被表达出来。特别是我们现在这个答案数据的时代,我们时常会遇见很多高精度的数据,有时要对它们进行操作就会很困难。
于是乎,我们引入了高精度算法:
我们先总结一下高精度算法的一些特性:
·首先高精度计算,我们肯定要把按字符串读入的数字转化成真正的数字,并且为了统一加减乘除,我们把它们倒着存入一个vector;
·然后是我们会依据真实计算的方法,都是按位进行计算;
·值得注意的是,对于加法我们用t表示进位,对于减法,我们用t表示借一位,对于除法,我们用r表示当前余数,最后返回一个vector数组
·还要注意,高精度的乘除法,需要去掉前导零!
//接下来上板子:
//高精度加法:
#include
using namespace std;
vector
vector
int t=0;
for(int i=0;i
if(i
if(i
ans.push_back(t%10);
t/=10;
}
if(t) ans.push_back(t);
return ans;
}
int main()
{
string str1,str2;
cin>>str1>>str2;
vector
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
for(int i=ans.size()-1;i>=0;i--) printf("%d",ans[i]);
return 0;
}
//高精度减法
#include
using namespace std;
vector
vector
int t=0;
for(int i=0;i
t=a[i]-t;
if(i
ans.push_back((t+10)%10); //注意这个push值的方式
if(t<0) t=1;
else t=0;
}
while(ans.size()>1 && ans.back()==0) ans.pop_back(); //去掉前导零
return ans;
}
int main()
{
string a,b;
cin>>a>>b;
vector
for(int i=a.size()-1;i>=0;i--) va.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) vb.push_back(b[i]-'0');
if(a.size()
printf("-");
ans=sub(vb,va);
}
else ans=sub(va,vb);
for(int i=ans.size()-1;i>=0;i--) printf("%d",ans[i]);
return 0;
}
//高精度乘法
#include
using namespace std;
vector
int t=0;
vector
for(int i=0;i
t+=(a[i]*b);
ans.push_back(t%10);
t/=10;
}
if(t) ans.push_back(t); //如果t还有值就也要push
return ans;
}
int main()
{
string str;
int b;
cin>>str>>b;
vector
for(int i=str.size()-1;i>=0;i--) a.push_back(str[i]-'0');
if(b==0) printf("0");
else{
vector
for(int i=ans.size()-1;i>=0;i--) printf("%d",ans[i]);
}
return 0;
}
//高精度除法
#include
using namespace std;
void div(vector
vector
int r=0;
for(int i=a.size()-1;i>=0;i--){ //除法是要从高位向低位遍历
r=r*10+a[i];
ans.push_back(r/b);
r%=b; //push商,mod余数
}
while(ans.size()>1 && ans.front()==0) ans.erase(ans.begin()); //去除前导零
for(int i=0;i
printf("\n");
printf("%d",r);
return;
}
int main()
{
string a;
int b;
cin>>a>>b;
vector
for(int i=a.size()-1;i>=0;i--) va.push_back(a[i]-'0');
div(va,b);
return 0;
}