码迷,mamicode.com
首页 > 编程语言 > 详细

C++大数模板

时间:2016-07-16 00:00:18      阅读:421      评论:0      收藏:0      [点我收藏+]

标签:

#include <iostream>
#include <algorithm>
#include <iomanip>
#include <string.h>
using namespace std;
const int MAXN=10005;
const int BASE=100000;
const int LEN=5;//防止int溢出,最多基数最多设为5位
int max(int a,int b)
{
    if(a>b)
        return a;
    return b;
}
struct BigInt{
public:
    int e[MAXN];
    int len;
    BigInt()
    {
        memset(e,0,sizeof(e));
        len=0;
    }
    void set(int x)
    {
        while(x>0)
        {
            e[len++]=x%BASE;
            x/=BASE;
        }
    }
    bool operator>(const BigInt &b)
    {
        if(len>b.len)
        {
            return true;
        }
        else if(len==b.len)
        {
            int i;
            for(i=len-1;i>=0;i--)
            {
                if(e[i]>b.e[i])    return true;
                else if(e[i]<b.e[i])    return false;
                else ;
            }
            return false;
        }
        else    
        {
            return false;
        }
    }
    BigInt operator+(const BigInt &b)
    {
        BigInt res;
        res.len=max(len,b.len);
        int up=0;
        for(int i=0;i<res.len;i++)
        {
            int z=e[i]+b.e[i];
            res.e[i]=z%BASE;
            up=z/BASE;
        }
        if(up!=0)    res.e[res.len++]=up;
        return res;
    }
    BigInt operator-(const BigInt &b)
    {
        BigInt res;
        res.len=max(len,b.len);
        int down=0;
        for(int i=0;i<res.len;i++)
        {
            int z=e[i]-b.e[i]-down;
            if(z<0)
            {
                z+=BASE;
                down=1;
            }
            else
            {
                down=0;
            }
            res.e[i]=z;
        }
        while(res.len>1&&res.e[res.len-1]==0)    res.len--;
        return res;
    }
    BigInt operator*(const BigInt &b)
    {
        BigInt res;
        for(int i=0;i<len;i++)
        {
            int up=0;
            for(int j=0;j<b.len;j++)
            {
                int z=(e[i]*b.e[j]+res.e[i+j]+up);
                res.e[i+j]=z%BASE;
                up=z/BASE;
            }
            if(up!=0)    res.e[i+b.len]=up;
        }
        res.len=len+b.len;
        while(res.len>1&&res.e[res.len-1]==0)    res.len--;
        return res;
    }
    BigInt operator/(const int &b)
    {
        BigInt res=*this;
        int carry=0;
        for(int i=len-1;i>=0;i--)
        {
            res.e[i]+=carry*BASE;
            carry=res.e[i]%b;
            res.e[i]/=b;
        }
        while(res.len>1&&res.e[res.len-1]==0)    res.len--;
        return res;
    }
    BigInt operator%(const int &b)
    {
        BigInt tmp=*this;
        BigInt B;
        B.set(b);
        BigInt res=tmp-(tmp/b)*B;
        return res;
    }
    friend ostream &operator<<(ostream &out,const BigInt &res)
    {
        out<<res.e[res.len-1];
        for(int i=res.len-2;i>=0;i--)
        {
            out<<setw(LEN)<<setfill(0)<<res.e[i];
        }
        out<<endl;
        return out;
    }
};
int main()
{
    BigInt res;
    res.set(1092);
    res=res%1091;
    cout<<res;
    return 0;
}

 

C++大数模板

标签:

原文地址:http://www.cnblogs.com/program-ccc/p/5674709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!