高精度模板
从我洛谷博客里搬运的,算是补发一下
1.高精度加法:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string x,y;
int a[5000000],b[5000000],c[500000],lena,lenb,lenc,jb;
int main()
{
cin>>x>>y;
lena=x.length() ;
lenb=y.length() ;
for(int i=1;i<=lena;++i)
{
a[i]=x[lena-i]-'0';
}
for(int i=1;i<=lenb;++i)
{
b[i]=y[lenb-i]-'0';
}
while(lenc<=lena||lenc<=lenb)
{
c[lenc]=a[lenc]+b[lenc]+jb;
jb=c[lenc]/10;
c[lenc]=c[lenc]%10;
lenc++;
}
c[lenc]=jb;
while(c[lenc]==0&&lenc!=1)
{
lenc--;
}
for(int i=lenc;i>=1;--i)
{
cout<<c[i];
}
return 0;
}
2.高精度减法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string x,y;
int bijiao(string xx,string yy)
{
if(xx.length() < yy.length() )
{
return 1;
}
else if(xx.length() > yy.length() )
{
return 0;
}
else
{
for(int i=0;i<xx.length() ;++i)
{
if(xx[i]>yy[i])
{
return 0;
}
if(xx[i]<yy[i])
{
return 1;
}
}
}
return 0;
}
int a[5000000],b[5000000],c[500000],lena,lenb,lenc=1,jb;
int main()
{
cin>>x>>y;
if(bijiao(x,y))
{
string g=x;
x=y;
y=g;
cout<<"-";
}
lena=x.length() ;
lenb=y.length() ;
for(int i=1;i<=lena;++i)
{
a[i]=x[lena-i]-'0';
}
for(int i=1;i<=lenb;++i)
{
b[i]=y[lenb-i]-'0';
}
while(lenc<=lena||lenc<=lenb)
{
if(a[lenc]<b[lenc])
{
a[lenc]+=10;
a[lenc+1]--;
}
c[lenc]=a[lenc]-b[lenc];
lenc++;
}
while(c[lenc]==0&&lenc!=1)
{
lenc--;
}
for(int i=lenc;i>=1;--i)
{
cout<<c[i];
}
return 0;
}
注意减数和被减数的大小关系O(∩_∩)O~
3.高精度乘法:
一边乘一边进行进位操作
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string s1,s2;
int a[20000],b[20000],len1,len2,len3,c[20000];
int main()
{
cin>>s1>>s2;
len1=s1.length() ;
len2=s2.length() ;
for(int i=1;i<=len1;++i)
{
a[i]=s1[len1-i]-'0';
}
for(int i=1;i<=len2;++i)
{
b[i]=s2[len2-i]-'0';
}
int x;
for(int i=1;i<=len1;++i)
{
x=0;
for(int j=1;j<=len2;++j)
{
c[i+j-1]=a[i]*b[j]+c[i+j-1]+x;
x=c[i+j-1]/10;
c[i+j-1]%=10;
}
c[i+len2]=x;//进最前面的一位O(∩_∩)O哈哈哈~划重点
}
len3=len1+len2;
while(c[len3]==0&&len3>1)
{
len3--;
}
for(int i=len3;i>=1;--i)
{
cout<<c[i];
}
return 0;
}
例子:求10000以内n的阶乘。
下例子中用到的高精乘法是先全乘起来吗,然后在进行处理进位等
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int a[1000000],n;
int main()
{
cin>>n;
int len=1;
a[1]=1;
int x;
for(int i=2;i<=n;++i)
{
for(int j=1;j<=len;++j)
{
a[j]=a[j]*i;
}
for(int k=1;k<=len;++k)
{
if(a[k]>9)
{
a[k+1]+=a[k]/10;
a[k]=a[k]%10;
if(k==len) len++;//最高位进位
}
}
}
for(int i=len;i>=1;--i)
{
cout<<a[i];
}
return 0;
}
4.高精度除法:
(1)高精除单精
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
string s1,s2;
int a[20000],b[20000],len1,len2,len3,c[20000];
int main() {
cin>>s1;
int g;
cin>>g;
len1=s1.length() ;
for(int i=0; i<len1; ++i) {
a[i+1]=s1[i]-'0';
}
int x=0;
for(int i=1;i<=len1;++i)
{
c[i]=(x*10+a[i])/g;
x=(x*10+a[i])%g;
}
len3=1;
while(c[len3]==0&&len3<len1)
{
len3++;
}
for(int i=len3;i<=len1;++i)
{
cout<<c[i];
}
return 0;
}
高精度总结:
1.注意最高位的处理。
2.注意删除前导0
重载运算符实现高精
$$Life \quad is \quad fantastic!$$