高精度c语言模板

#include"stdio.h"
#include"iostream"
using namespace std;
#define maxlen 1000
struct HP{int len,s[maxlen];};
void PrintHP(HP x) {for(int i=x.len;i>=1;i--) cout<0;){x.s[++x.len]=inte%10;inte/10;}
}
void Multi(const HP a,const HP b,HP& c)
{
	int i,j;c.len=a.len+b.len;
	for(int i=1;i<=c.len;i++) c.s[i]=0;
	for(i=1;i<=a.len;i++) for(j=1;j<=b.len;j++) c.s[i+j-1]+=a.s[i]*b.s[j];
	for(i=1;i1&&!c.s[i]) i--;c.len=i;
}
void Plus(const HP a,const HP b,HP&c)
{
	int i;c.s[1]=0;
	for(i=1;i<=a.len||i<=b.len||c.s[i];i++){
		if(i<=a.len) c.s[i]+=a.s[i];
		if(i<=b.len) c.s[i]+=b.s[i];
		c.s[i+1]=c.s[i]/10;c.s[i]%=10;
	}
	c.len=i-1;if(c.len==0) c.len=1;
}
void Substract(const HP a,const HP b,HP&c)
{
	for(int i=1,j=0;i<=a.len;i++){
		c.s[i]=a.s[i]-j;if(i<=b.len) c.s[i]-=b.s[i];
		if(c.s[i]<0){j=1;c.s[i]+=10;}else j=0;
	}
	c.len=a.len;while(c.len>1&&!c.s[c.len]) c.len--;
}
int HPCompare(const HP x,const HP y)
{
	if(x.len>y.len) return 1;
	if(x.len1)&&(x.s[i]==y.s[i])) i--;
	return x.s[i]-y.s[i];
}
void Divide(const HP a,const HP b,HP &c,HP &d)
{
	int i,j;d.len=1;d.s[1]=0;
	for(i=a.len;i>0;i--){
		if(!(d.len==1&&d.s[1]==0))
		{for(j=d.len;j>0;j--)d.s[j+1]=d.s[j];++d.len;}
		d.s[1]=a.s[i];c.s[i]=0;
		while((j=HPCompare(d,b))>=0)
		{Substract(d,b,d);c.s[i]++;if(j==0) break;}
	}
	c.len=a.len;while((c.len>1)&&(c.s[c.len]==0))c.len--;
}
int main()
{
	HP a,b;
	char s1[100],s2[100];
	while(1)
	{
	scanf("%s%s",s1,s2);
	Str2HP(s1,a);Str2HP(s2,b);
	HP c;
	Plus(a,b,c);//+
	PrintHP(c);
	printf("\n");
	Multi(a,b,c);//*
	PrintHP(c);
	printf("\n");
	Substract(a,b,c);//-
	PrintHP(c);
	printf("\n");
	HP d;
	Divide(a,b,c,d);// /
	PrintHP(c);
	printf("\n");
	printf("%d\n",HPCompare(a,b));//比较
	}
	return 0;
}

你可能感兴趣的:(模板)