高精度模板

从我洛谷博客里搬运的,算是补发一下

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

重载运算符实现高精

点这里

posted @ 2019-06-01 18:15  pyyyyyy  阅读(142)  评论(3编辑  收藏  举报