重载“+-*/”实现高精度运算


       在只进行加法和减法时,我们可以压八位来加快速度,当有乘法时,压八位会爆int所以我们压四位。 高精度除法压位比较难写,所以我们不选择压位。在程序的前端声明一个变量P来记录压位的位数,M记录压N位时对应的最小的数,即可使程序更容易调试。

const int M=100000000,
               P=8;
//输出可以这样写
printf("%*d",P,n[i]);


加减,压八位,输出补零

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=100000000,
		  P=8; 	//压位

struct bignum 
{
	int n[5000],l; 	//n数组存放每个结构体中的"大数",l记录长度。
	bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
	void init() 	//输入过程
	{
		string s;
		cin>>s;
		int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10 
		for(int i=s.length()-1;i>=0;i--)  //从s的长度-1开始 
		{
			n[now]+=(s[i]-'0')*c1;
			c1*=10;
			ct++;
			if(ct==P&&i!=0)  // 如果i=0了就没有必要now++; 
			{
				now++;
				ct=0;
				c1=1;
			}		
		}
		l=now+1;   //l的长度为now+1; 
	}
	void print()
	{
		printf("%d",n[l-1]);
		for(int i=l-2;i>=0;i--)	
		printf("%0*d",P,n[i]);  //补零输出 
		printf("\n");
	}
//-----------------------------------------------
	bignum operator + (bignum x) const 	//重载加号
	{
		bignum t=*this;
		if(x.l>t.l)t.l=x.l;
		for(int i=0;i<t.l;i++)
		{
			t.n[i]+=x.n[i];
			if(t.n[i]>=M)
			{
				t.n[i+1]+=t.n[i]/M;
				t.n[i]%=M;
			}
		}
		return t;			//  注意:将t的值返回 
	} 
//------------------------------------------------
	bool operator < (bignum x) const  	//重载小于号 
	{
		bignum t=*this;
		if(t.l!=x.l)return t.l<x.l;
		for(int i=t.l-1;i>=0;i--)
		{
			if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
		}
		return 0;
	}
	bignum operator -(bignum x) const	//重载减号 
	{
		bignum t=*this;
		if(t<x){printf("-");swap(t,x);}
		int jie =0;
		for(int i=0;i<t.l;i++)
		{
			t.n[i]-=x.n[i];
			while(t.n[i]<0)
			{
				t.n[i]+=M;
				jie++;		
			}
			t.n[i+1]-=jie;
			jie=0;
		}
		while(!t.n[t.l-1] && t.l>1)t.l--;  // 相减后有可能出现前面有0的情况,所以t.l--; 
		return t;
	}
//----------------------------------------------
}a,b,c;

int main()
{
	a.init();		//读入字符串a和b 
	b.init();
	
	c=a+b;				
	c.print();

	c=a-b;
	c.print();
	
	c=a*b;
	c.print();
		 
	return 0;
} 




加减乘,压四位,输出补零


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=10000,
		  P=4; 	//压位

struct bignum 
{
	int n[5000],l; 	//n数组存放每个结构体中的"大数",l记录长度。
	bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
	void init() 	//输入过程
	{
		string s;
		cin>>s;
		int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10 
		for(int i=s.length()-1;i>=0;i--)  //从s的长度-1开始 
		{
			n[now]+=(s[i]-'0')*c1;
			c1*=10;
			ct++;
			if(ct==P&&i!=0)  // 如果i=0了就没有必要now++; 
			{
				now++;
				ct=0;
				c1=1;
			}		
		}
		l=now+1;   //l的长度为now+1; 
	}
	void print()
	{
		printf("%d",n[l-1]);
		for(int i=l-2;i>=0;i--)	
		printf("%0*d",P,n[i]);  //补零输出 
		printf("\n");
	}
//-----------------------------------------------
	bignum operator + (bignum x) const 	//重载加号
	{
		bignum t=*this;
		if(x.l>t.l)t.l=x.l;
		for(int i=0;i<t.l;i++)
		{
			t.n[i]+=x.n[i];
			if(t.n[i]>=M)
			{
				t.n[i+1]+=t.n[i]/M;
				t.n[i]%=M;
			}
		}
		return t;			//  注意:将t的值返回 
	} 
//------------------------------------------------
	bool operator < (bignum x) const  	//重载小于号 
	{
		bignum t=*this;
		if(t.l!=x.l)return t.l<x.l;
		for(int i=t.l-1;i>=0;i--)
		{
			if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
		}
		return 0;
	}
	bignum operator -(bignum x) const	//重载减号 
	{
		bignum t=*this;
		if(t<x){printf("-");swap(t,x);}
		int jie =0;
		for(int i=0;i<t.l;i++)
		{
			t.n[i]-=x.n[i];
			while(t.n[i]<0)
			{
				t.n[i]+=M;
				jie++;		
			}
			t.n[i+1]-=jie;
			jie=0;
		}
		while(!t.n[t.l-1] && t.l>1)t.l--;  // 相减后有可能出现前面有0的情况,所以t.l--; 
		return t;
	}
//------------------------------------------------
	bignum operator *(bignum x) const //重载乘号 
	{
		bignum t=*this,tep;
		tep.l=t.l+x.l-1;
		for(int i=0;i<t.l;i++)
		for(int j=0;j<x.l;j++)
		{
			tep.n[i+j]+=t.n[i]*x.n[j];
			if(tep.n[i+j]>=M)
			{
				tep.n[i+j+1]+=tep.n[i+j]/M;
				tep.n[i+j]%=M;
			}
		}
		while(tep.n[tep.l])
		{
			tep.n[tep.l+1]+=tep.n[tep.l]/M;
			tep.n[tep.l++]%=M;
		}
		return tep;
	}
//-----------------------------------------
}a,b,c;

int main()
{
	a.init();		//读入字符串a和b 
	b.init();
	
	c=a+b;				
	c.print();

	c=a-b;
	c.print();
	
	c=a*b;
	c.print();
		 
	return 0;
} 
	



加减乘除,不压位


#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int M=10,
		  P=1; 	//压位

struct bignum 
{
	int n[5000],l; 	//n数组存放每个结构体中的"大数",l记录长度。
	bignum(){l=1,memset(n,0,sizeof(n));}
//-----------------------------------------------
	void init() 	//输入过程
	{
		string s;
		cin>>s;
		int now=0,ct=0,c1=1; //now记录当前是n数组的第几位,ct记录已经读入多少字符了,满八进一,c1是辅助变量,因为我们是倒着读入,所以每次要乘10 
		for(int i=s.length()-1;i>=0;i--)  //从s的长度-1开始 
		{
			n[now]+=(s[i]-'0')*c1;
			c1*=10;
			ct++;
			if(ct==P&&i!=0)  // 如果i=0了就没有必要now++; 
			{
				now++;
				ct=0;
				c1=1;
			}		
		}
		l=now+1;   //l的长度为now+1; 
	}
	void print()
	{
		printf("%d",n[l-1]);
		for(int i=l-2;i>=0;i--)	
		printf("%0*d",P,n[i]);  //补零输出 
		printf("\n");
	}
//-----------------------------------------------
	bignum operator + (bignum x) const 	//重载加号
	{
		bignum t=*this;
		if(x.l>t.l)t.l=x.l;
		for(int i=0;i<t.l;i++)
		{
			t.n[i]+=x.n[i];
			if(t.n[i]>=M)
			{
				t.n[i+1]+=t.n[i]/M;
				t.n[i]%=M;
			}
		}
		return t;			//  注意:将t的值返回 
	} 
//------------------------------------------------
	bool operator < (bignum x) const  	//重载小于号 
	{
		bignum t=*this;
		if(t.l!=x.l)return t.l<x.l;
		for(int i=t.l-1;i>=0;i--)
		{
			if(t.n[i]!=x.n[i]) return t.n[i]<x.n[i];
		}
		return 0;
	}
	bignum operator -(bignum x) const	//重载减号 
	{
		bignum t=*this;
		if(t<x){printf("-");swap(t,x);}
		int jie =0;
		for(int i=0;i<t.l;i++)
		{
			t.n[i]-=x.n[i];
			while(t.n[i]<0)
			{
				t.n[i]+=M;
				jie++;		
			}
			t.n[i+1]-=jie;
			jie=0;
		}
		while(!t.n[t.l-1] && t.l>1)t.l--;  // 相减后有可能出现前面有0的情况,所以t.l--; 
		return t;
	}
//------------------------------------------------
	bignum operator *(bignum x) const //重载乘号 
	{
		bignum t=*this,tep;
		tep.l=t.l+x.l-1;
		for(int i=0;i<t.l;i++)
		for(int j=0;j<x.l;j++)
		{
			tep.n[i+j]+=t.n[i]*x.n[j];
			if(tep.n[i+j]>=M)
			{
				tep.n[i+j+1]+=tep.n[i+j]/M;
				tep.n[i+j]%=M;
			}
		}
		while(tep.n[tep.l])
		{
			tep.n[tep.l+1]+=tep.n[tep.l]/M;
			tep.n[tep.l++]%=M;
		}
		return tep;
	}
//-----------------------------------------
	void Add(int x){if(x||l)n[l++]=x;}  //除法 
	void Re(){reverse(n,n+l);}          //高精度除以高精度
	bignum operator /(const bignum &x)const
	{
		bignum t=*this,r,y;
		y.l=0,r.l=t.l;
		for(int i=t.l-1;i>=0;--i)
		{
			y.Add(t.n[i]);
			y.Re();
			while(!(y<x))y=y-x,r.n[i]++;
			while(!y.n[y.l-1] && y.l>=1)--y.l;
            y.Re();
		}
		while(!r.n[r.l-1] && r.l>1)--r.l;
		return r;
	}bignum operator /(const int &x)const        //高精度除以单精度
         {
             bignum t=*this,r;
             r.l=t.l;
  	    int tmp=0;
  	    for(int i=t.l-1;i>=0;--i)
   	    {
   		tmp+=t.n[i];
   		if(tmp>=x)
    		r.n[i]+=tmp/x,tmp%=x;
   		tmp*=M;
  	    }
  	    while(!r.n[r.l-1] && r.l>1)--r.l;
  	    return r;
         }
}a,b,c;

int main()
{
	a.init();		//读入字符串a和b 
	b.init();
	
	c=a+b;				
	c.print();

	c=a-b;
	c.print();
	
	c=a*b;
	c.print();
	
	c=a/b;
	c.print();	 
	return 0;
} 
			


最后剽窃一个功能更丰富的- - 


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int M=10,P=1; 


struct BigNum
{
       int n[5000],l,Y;
       BigNum(){l=1,memset(n,0,sizeof(n));}
       //----------------------------------
       void init()
       {
            string s;
            cin>>s;
            int now=0,ct=0,c1=1;
            for(int i=s.length()-1;i>=0;i--)
            {
             n[now]+=(s[i]-'0')*c1;
             c1*=10;
             ct++;
             if(ct==P&&i!=0)
             {
              now++;
              c1=1;
              ct=0;
             }        
            }
            l=now+1;     
       }
       //-----------------------------------
       void print()
       {
            printf("%d",n[l-1]);
            for(int i=l-2;i>=0;i--)
            printf("%0*d",P,n[i]);
            printf("\n");
       }
       //------------------------------------
       BigNum operator +(BigNum x)const
       {
              BigNum t=*this;
              if(x.l>t.l)t.l=x.l;
              for(int i=0;i<t.l;i++)
              {
               t.n[i]+=x.n[i];
               if(t.n[i]>=M)
               {
                   t.n[i+1]+=t.n[i]/M;
                   t.n[i]%=M;             
               }        
              }
              while(t.n[t.l])
              {
                  t.n[t.l+1]+=t.n[t.l]/M;
                  t.n[t.l++]%=M;               
              }     
              return t;  
       }
       //--------------------------------------
       bool operator < (BigNum x) const
       {
           BigNum t=*this;
           if(t.l!=x.l)return t.l<x.l;
           for(int i=t.l-1;i>=0;i--)
           {
              if(t.n[i]!=x.n[i])return t.n[i]<x.n[i];        
           }
           return 0;       
       }
       BigNum operator -(BigNum x)const
       {
           BigNum t=*this;
           if(t<x){printf("-");swap(t,x);} 
           for(int i=0;i<t.l;i++)
           {
            t.n[i]-=x.n[i];
            if(t.n[i]<0)
            {
                t.n[i]+=M;
                --t.n[i+1];            
            }        
           } 
           while(!t.n[t.l-1]&&t.l>1)t.l--;
           return t;     
       }
       //--------------------------------------------
       BigNum operator * (BigNum x) const
       {
              BigNum c,t=*this;
              c.l=t.l+x.l-1;
              for(int i=0;i<t.l;i++)
              for(int j=0;j<x.l;j++)
              {
                  c.n[i+j]+=t.n[i]*x.n[j];
                  if(c.n[i+j]>=M)
                  {
                      c.n[i+j+1]+=c.n[i+j]/M;
                      c.n[i+j]%=M;               
                  }        
              }
              while(c.n[c.l])
              {
                   c.n[c.l+1]+=c.n[c.l]/M;
                   c.n[c.l++]%=M;               
              }       
              return c;
       }
       BigNum operator * (int x) const
       {
          BigNum t=*this,c;
          c.l=t.l;
          for(int i=0;i<t.l;i++)
          {
              c.n[i]+=t.n[i]*x;
              if(c.n[i]>=M)
              {
                   c.n[i+1]+=c.n[i]/M;
                   c.n[i]%=M;             
              }        
          }       
          while(c.n[c.l])
          {
                 c.n[c.l+1]+=c.n[c.l]/M;
                 c.n[c.l++]%=M;               
          }
          return c;
       }
       //--------------------------------------------
    void Add(int x){if(x||l)n[l++]=x;}
    void Re(){reverse(n,n+l);}
    BigNum operator /(const BigNum &x)const
    {
        BigNum t=*this,r,y;
        y.l=0,r.l=t.l;
        for(int i=t.l-1;i>=0;--i)
        {
            y.Add(t.n[i]);
            y.Re();
            while(!(y<x))y=y-x,r.n[i]++;
            while(!y.n[y.l-1] && y.l>1)--y.l;
            y.Re();
        }
        while(!r.n[r.l-1] && r.l>1)--r.l;
        return r;
    }
    BigNum operator /(const int &x)const
    {
        BigNum t=*this,r;
        r.l=t.l;
        int tmp=0;
        for(int i=t.l-1;i>=0;--i)
        {
            tmp+=t.n[i];
            if(tmp>=x)
                r.n[i]+=tmp/x,tmp%=x;
            tmp*=M;
        }
        while(!r.n[r.l-1] && r.l>1)--r.l;
        return r;
    }
       //---------------------------------------
       
}a,b,c;


int main()
{
    a.init();
    b.init();
    
    c=a+b;
    c.print();
    
    c=a-b;
    c.print();
    
    c=a*b;
    c.print();
    
    c=a/b;
    c.print();
    return 0;        
}


  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
C++中的高精度运算重载是指对整数进行大数运算时,通过重载运算符来实现对大数的加减乘除等操作。一般情况下,C++内置的整数类型(如int、long等)有一定的位数限制,无法处理超过其表示范围的大数。而通过运算重载,我们可以自定义一个类来表示大数,并对其进行各种运算操作。 以下是一个简单的示例,展示了如何实现C++中的高精度运算重载: ```cpp #include <iostream> #include <vector> using namespace std; class BigInteger { private: vector<int> digits; // 用vector存储大数的每一位 public: BigInteger() {} BigInteger(int num) { while (num > 0) { digits.push_back(num % 10); num /= 10; } } BigInteger operator+(const BigInteger& other) const { BigInteger result; int carry = 0; int i = 0; while (i < digits.size() || i < other.digits.size() || carry != 0) { int sum = carry; if (i < digits.size()) { sum += digits[i]; } if (i < other.digits.size()) { sum += other.digits[i]; } result.digits.push_back(sum % 10); carry = sum / 10; i++; } return result; } friend ostream& operator<<(ostream& os, const BigInteger& num) { for (int i = num.digits.size() - 1; i >= 0; i--) { os << num.digits[i]; } return os; } }; int main() { BigInteger a(123456789); BigInteger b(987654321); BigInteger c = a + b; cout << "a + b = " << c << endl; return 0; } ``` 在上述示例中,我们定义了一个名为BigInteger的类,用于表示大数。通过重载加法运算符`+`,我们可以实现对两个BigInteger对象的相加操作。同时,我们还重载了输出流运算符`<<`,以便能够直接输出BigInteger对象的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值