高精度
基本思想
高精度问题是说当数字位数过多,超过long long的表示范围,如何实现这种超大数的加减乘除
代码模板
高精度加法
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+10;
char s1[N],s2[N];
void out(vector<int>&a)
{
int n=a.size();
for(int i=n-1;~i;i--)printf("%d",a[i]);
printf("\n");
}
void add(vector<int>&a1, vector<int>&a2)
{
int n1=a1.size(),n2=a2.size();
for(int i=0,t=0;t||i<n1||i<n2;i++)
{
int a=i<n1?a1[i]:0;
int b=i<n2?a2[i]:0;
t+=a+b;
if(i<n1)a1[i]=t%10;
else a1.push_back(t%10);
t/=10;
}
}
int main()
{
scanf("%s%s",s1,s2);
vector<int> a1,a2;
int n1=strlen(s1);
for(int i=n1-1;~i;i--)a1.push_back(s1[i]-'0');
int n2=strlen(s2);
for(int i=n2-1;~i;i--)a2.push_back(s2[i]-'0');
//out(a1),out(a2);
add(a1,a2);
int n=a1.size()-1;
while(n>=0)printf("%d",a1[n--]);
printf("\n");
return 0;
}
高精度乘法
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+10;
char s[N];
int b;
void mul(vector<int>&a,int b)
{
int n=a.size(),t=0;
for(int i=0;t||i<n;i++)
{
int p=i<n?a[i]:0;
t+=p*b;
if(i<n)a[i]=t%10;
else a.push_back(t%10);
t/=10;
}
int i=a.size()-1;
while(i&&!a[i--])a.pop_back();
}
void out(vector<int>&a)
{
int n=a.size();
for(int i=n-1;~i;i--)printf("%d",a[i]);
printf("\n");
}
int main()
{
scanf("%s%d",s,&b);
int n=strlen(s);
vector<int>a;
for(int i=n-1;~i;i--)a.push_back(s[i]-'0');
mul(a,b);
out(a);
return 0;
}
高精度减法
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N=1e5+10;
char s1[N],s2[N];
bool cmp(vector<int>&a,vector<int>&b)
{
int n1=a.size(),n2=b.size();
if(n1!=n2)return n1>n2;
for(int i=n1-1;~i;i--) if(a[i]!=b[i]) return a[i]>b[i];
return true;
}
void sub(vector<int>&a,vector<int>&b)
{
int n1=a.size(),n2=b.size();
int t=0,i;
for(i=0;i<n1;i++)
{
t+=a[i];
if(i<n2)t-=b[i];
if(t<0)a[i]=t+10,t=-1;
else a[i]=t,t=0;
}
i=n1-1;
while(i&&a[i--]==0)a.pop_back();
}
void out(vector<int>&a)
{
int n=a.size();
for(int i=n-1;~i;i--)printf("%d",a[i]);
printf("\n");
}
int main()
{
scanf("%s%s",s1,s2);
vector<int>a,b;
int n1=strlen(s1),n2=strlen(s2);
for(int i=n1-1;~i;i--)a.push_back(s1[i]-'0');
for(int i=n2-1;~i;i--)b.push_back(s2[i]-'0');
bool positive=true;
if(cmp(a,b))sub(a,b);
else positive=false,sub(b,a);
if(positive)out(a);
else {printf("-");out(b);};
return 0;
}
高精度除法
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=1e5+10;
char s[N];
void div(vector<int>&c,int &r,vector<int>&a,int b)
{
int n=a.size();
for(int i=0;i<n;i++)
{
r=r*10+a[i];
if(c.size()||(r/b))c.push_back(r/b);
r%=b;
}
if(!c.size())c.push_back(0);
}
void out(vector<int>&a)
{
int n=a.size();
for(int i=0;i<n;i++)printf("%d",a[i]);
printf("\n");
}
int main()
{
int b;
scanf("%s%d",s,&b);
int n=strlen(s);
vector<int>a;
for(int i=0;i<n;i++)a.push_back(s[i]-'0');
vector<int>c;
int r=0;
div(c,r,a,b);
out(c);
printf("%d\n",r);
return 0;
}
应用场景
涉及到大数运算的题目