⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 大数浮点数模板.cpp

📁 巨大浮点数计算的模板 可以计算1000位的浮点数
💻 CPP
字号:
#include<iostream>
using namespace std;
 
const int maxlen=10000;

class HP
{
	public:
    int len,s[maxlen];
	HP(){(*this)=0;};
    HP(int inte){(*this)=inte;};
	HP(const char*str){(*this)=str;};
	friend ostream& operator<<(ostream &cout,const HP &x);
	HP operator =( int inte);
	HP operator =(const char*str);
	HP operator *(const HP &b);
	HP operator +(const HP &b);
	HP operator -(const HP &b);
	HP operator /(const HP &b);
	HP operator %(const HP &b);
	int Compare  (const HP &b);
};

ostream& operator<<(ostream &cout,const HP &x)
{ 
	for(int i=x.len;i>=1;i--) cout<<x.s[i]; return cout;
}

HP HP::operator=(const char *str)
{ 
		len=strlen(str);
        for(int i=1;i<=len;i++) s[i]=str[len-i]-'0';
        return *this ;
}

HP HP::operator=( int inte)
{
	if(inte==0) {len=1;s[1]=0;return(*this);};
    for(len=0;inte>0; ){s[++len]=inte%10;inte/=10;}
    return(*this);
}

HP HP::operator *(const HP &b)
{
	int i,j;
	HP c;
	c.len=len+b.len;
	for(i=1;i<=c.len;i++) c.s[i]=0;
	for(i=1;i<=len;i++) for(j =1;j<=b.len;j++)c.s[i+j-1]+=s[i]*b.s[j];
	for(i=1;i<c.len;i++) {c.s[i+1]+=c.s[i]/10;c.s[i]%=10;}
	while(c.s[i]){c.s[i+1]=c.s[i]/10;c.s[i]%=10;i++;} 
	while(i>1&&!c.s[i])i--;
	c.len=i;
	return c ;
}

HP HP::operator +(const HP &b)
{ 
    int i;
    HP c;
	c.s[1]=0;
	for(i=1;i<=len||i<=b.len||c.s[i];i++) 
	{
		if(i<=len)c.s[i]+=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;
    return c ;
}

HP HP::operator -(const HP &b)
{ 
	int i,j;
	HP c ;
    for(i=1,j=0;i<=len;i++) 
	{
		c.s[i]=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=len;
	while(c.len>1&&!c.s[c.len])c.len--;
    return c ;
}

int HP::Compare(const HP &y)
{ 
	if(len>y.len)return 1;
    if(len<y.len)return -1;
    int i=len;
    while((i>1)&&(s[i]==y.s[i]))i--;
    return s[i]-y.s[i];
}
 
HP HP::operator /(const HP &b)
{ 
	int i,j;
	HP d(0),c;
    for(i=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]=s[i];c.s[i]=0;
        while((j=d.Compare(b))>=0)
       {
			d=d-b;
			c.s[i]++;
			if(j==0)break;
		}
	}
	c.len=len;
	while((c.len>1)&&(c.s[c.len]==0))c.len--;
    return c ;
}
HP HP::operator %(const HP &b)
{
	int i,j; 
	HP d(0);
    for(i=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]=s[i];
          while((j=d.Compare(b))>=0){d=d-b;if(j==0)break;}
    }
	return d;
}

const int fprec=100;// floating-point precision
HP zero=0;
class FS
{
	public :
             FS ();
	         void SetZero();
             FS(int inte){(*this)=inte;}
			 FS(char *s) {(*this)=s;} 
			 FS operator =(char *s);
			 FS operator =(int inte);
             FS operator +(FS b);
			 FS operator -(FS b);
             FS operator *(FS b);
			 FS operator /(FS b);
             friend ostream& operator<<(ostream &cout,FS x);
             int sign,prec;
             HP num;
};
void FS::SetZero(){sign=1;num=0;prec=0;}

FS::FS(){SetZero();}

ostream& operator<<(ostream &cout,FS x)
{
	if(x.sign<0)cout<<"-";
    int i,k,low=1;
    for(i=x.num.len;i>x.prec;i--) cout<<x .num.s[i];
    if(x.num.len<=x.prec)cout<<"0";
    if(x .num. Compare(zero)==0){cout<<".0";return cout;}
	k=i;
    while(k>0 &&x.num.s[k]==0)k--;
    if(k==0){cout<<".0";return cout;}
	cout<<".";
    if(x.num.len<x.prec)
		for(int j=0;j<x.prec-x.num.len;j++) cout<<"0";
    while(x .num.s[low]==0) low++;
    while(i>=low ) cout<<x.num.s[i--];
    return cout ;
}

FS FS::operator=(int inte)
{
	prec=0;
    if(inte>=0){sign=1;num=inte;} 
	else        {sign=-1;num=-inte;}
	return(*this);
}

FS FS::operator=(char *s)
{ 
	int p,i,j,l;
    SetZero();
    if(s[0]=='-') {sign=-1;s++;};
    if(s[0]=='+'){sign=1;s++;};
    l=strlen(s);
	for(p=0;p<l;p++) if(s[p]== '.')break;
	if(p==l)prec=0;  else prec=l-1-p;
	for(i=l-1,j=0;i>=0;i--) if(s[i]!='.') num.s[++j ]=s[i]-'0';
	while(j>1&&num.s[j]==0)--j;num.len=j;
	return(*this);
}

void LShift(FS &a,int sl)
{ 
	a.prec+=sl;
	a.num.len+=sl;
	int i;
	for(i=a.num.len;i>sl;i--) 
		a.num.s[i]=a.num.s[i-sl];
	while(i>0)
		a.num.s[i--]=0;
}

void RShift(FS &a,int sl)
{ 
	a.prec-=sl;
	a.num.len-=sl;
	int i;
	for(i=1;i<=a.num.len;i++)
		a.num.s[i]=a.num.s[i+sl];
}
FS FS::operator+(FS b)
{   
	FS c;
	if(prec>b.prec)     LShift(b,prec-b.prec);
	else if(prec<b.prec)LShift((*this),b.prec-prec);
	if(sign==b.sign)
	{
		c.sign=sign;c.prec=prec;c.num=num+b .num;
	    if(c.num.Compare(zero)==0)c.SetZero();
	} 
	else
	{
		c.prec=prec;
	    if(num.Compare(b.num)==0) c.SetZero();
		else if(num.Compare(b.num)>0){c.sign=sign;c.num=num-b.num;} 
		else if(num.Compare(b.num)<0){c.sign=b.sign;c.num=b.num-num;}
		if(c.num.Compare(zero)==0)c.SetZero();
	}
	if(c.prec>fprec) RShift(c,c.prec-fprec);
	return c ;
}
FS FS::operator-(FS b)
{   
	b.sign=-b.sign;
	FS c=(*this)+b;
	b.sign=-b.sign;
	return c ;
}
FS FS::operator *(FS b)
{
	FS c;
	c.sign=sign *b.sign;
	c.prec=prec+b.prec;
	c.num=num *b.num;
	if(c.num.Compare(zero)==0)c.SetZero();
	if(c.prec>fprec) RShift(c,c.prec-fprec);
	return c ;
}
FS FS::operator /(FS b) // 355/133 = 3.1415929203539823008849557522124
{
	FS c,d; // c = d / b
	d=(* this);
	LShift(d,fprec);
	c.sign=d.sign*b.sign;
	c.prec=d.prec;
	LShift(d,b.prec);
	c.num=d.num/b.num;
	if(c.prec>fprec)RShift(c,c.prec-fprec);
	return c;
}
main()
{
	char a[maxlen],b[maxlen];
    FS c,d;
	while(scanf("%s%s",a,b)!=EOF)
	{
		c=a;d=b;
		cout<<"a+b:  "<<c+d<<endl;
		cout<<"a-b:  "<<c-d<<endl;
		cout<<"a*b:  "<<c*d<<endl;
		cout<<"a/b:  "<<c/d<<endl;
	}
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -