C++ 高精度学习

昨天学习了一下高精度加减乘除,感觉还不错,顺便还练习了一下重载
参考了一下别人的模板(来源未知)
完整代码如下(只考虑非负数):

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1005;
struct bign
{
    int len,s[N];
    bign()  {  memset(s,0,sizeof(s));  len=1;  }
    bign(int num)  {  *this=num; }
    bign(char *num) { *this=num; }
    //赋值 
    bign operator =(int num)
    {
        char c[N];
        sprintf(c,"%d",num);
        *this=c;
        return *this;
    }
    bign operator =(const char *num)
    {
        len=strlen(num);
        for (int i=0;i<len;i++) s[i]=num[len-1-i]-'0';//reverse
        return *this;
    }
    //比大小 
    bool operator <(const bign &b)
    {
        if (len!=b.len) return len<b.len;
        for (int i=len-1;i>=0;i--)
            if (s[i]!=b.s[i]) return s[i]<b.s[i];
        return false;
    }
    bool operator >(const bign &b)
    {
        if (len!=b.len) return len>b.len;
        for (int i=len-1;i>=0;i--)
            if (s[i]!=b.s[i]) return s[i]>b.s[i];
        return false;
    }
    bool operator ==(const bign &b){
    	return !(*this<b)&&!(*this>b);
	}
	//转化为string类 
    string str()
    {
        string res="";
        for (int i=0;i<len;i++) res=(char)(s[i]+'0')+res;//reverse
        return res;
    }
    //清除前导0 
    void clean()
    {
        while (len>1&&!s[len-1]) len--;
    }
    //重载运算符 
    bign operator +(const bign &b)
    {
        bign c;    
        c.len=0;
        for (int i=0,g=0;g||i<len||i<b.len;i++)
        {
            int x=g;
            if (i<len) x+=s[i];
            if (i<b.len) x+=b.s[i];
            c.s[c.len++]=x%10;
            g=x/10;
        }
        return c;
    }
    bign operator +=(const bign &b)
    {
        *this=*this+b;
        return *this;
    }
    bign operator -(const bign &b)
    {
        bign c;
        c.len=0;
        int x;     
        for (int i=0,g=0;i<len;i++)
        {
            x=s[i]-g;
            if (i<b.len) x-=b.s[i];
            if (x>=0) g=0;
            else{          
                x+=10;
                g=1;
            };
            c.s[c.len++]=x;
        }
        c.clean();
        return c;
    }
    bign operator -=(const bign &b)
    {
        *this=*this-b;
        return *this;
    } 
    bign operator *(const bign &b)
    {
        bign c;
        c.len=len+b.len;
        for (int i=0;i<len;i++) for (int j=0;j<b.len;j++) c.s[i+j]+=s[i]*b.s[j];
        for (int i=0;i<c.len-1;i++) { c.s[i+1]+=c.s[i]/10; c.s[i]%=10; }
        c.clean();
        return c;  
    }
    bign operator *=(const bign &b){
    	*this=*this*b;
    	return *this;
	}
    /* 
    bign operator /(const int &b){//低精度除法
		bign c;
		int f=0;
		for(int i=len-1;i>=0;i--){
			f*=10;
			f+=s[i];
			c.s[i]=f/b;
			f%=b;
		} 
		c.len=len;
		c.clean();
		return c;
	}
	*/
	bign operator /(const bign &b){//高精度除法 
		bign c,f=0;
		for(int i=len-1;i>=0;i--){
			f*=10;
			f+=s[i];
			while(f>b || f==b){
				f-=b;
				c.s[i]++;
			}
		}
		c.len=len;
		c.clean();
		return c;
	} 
    bign operator /=(const bign &b){
    	*this=*this/b;
    	return *this;
	}
};
istream& operator >>(istream &in,bign &x)
{
  string s;
  in>>s;
  x=s.c_str();
  return in;
}
ostream& operator <<(ostream &out,bign &x)
{
    out<<x.str();
    return out;
}
int main(){
    bign a,b,c;
    ios::sync_with_stdio(false);
    cin>>a>>b;
//    cout<<a<<endl;
//    cout<<b<<endl;
    c=a/b;
    cout<<c<<endl;
    return 0;
}

这样定义bign后便可以像基本类型一样用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值