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