/**
    只考虑正数[1, +∞);
    “-”运算只允许大数减小数;
    小端存储;
*/
typedef struct BigInteger0 {
    vector<int> v;
    BigInteger0(int len) {
        v.resize(len);
    }
    BigInteger0(const vector<int>& nv) {
        v.assign(nv.begin(), nv.end());
    }
    BigInteger0(const char str[]) {
        int len = strlen(str);
        v.resize(len);
        ; i < len; ++i)
            v[len -  - i] = str[i] - ';
    }
    BigInteger0 operator + (const BigInteger0& obj) const {
        BigInteger0 res(v);
        int len = max(v.size(), obj.v.size());
        res.v.resize(len + );
        ; i < len; ++i) {
            if(i < obj.v.size())res.v[i] += obj.v[i];
            ) {
                res.v[i + ] += res.v[i] / ;
                res.v[i] %= ;
            }
        }
        ] == )res.v.resize(res.v.size() - );
        return res;
    }

    /*默认v > obj,即v.size() > obj.v.size()*/
    BigInteger0 operator - (const BigInteger0& obj) const {
        BigInteger0 res(v);
        ; i < v.size(); ++i) {
            if(i < obj.v.size())res.v[i] -= obj.v[i];
            ) {
                res.v[i + ]--;
                res.v[i] += ;
            }
        }
        int len = res.v.size();
        ] == ; --len);
        res.v.resize(len);
        return res;
    }

    BigInteger0 operator * (const BigInteger0& obj) const {
        BigInteger0 res(v.size() + obj.v.size());
        , len1 = v.size(); i < len1; ++i) {
            , len2 = obj.v.size(); j < len2; ++j) {
                res.v[i + j] += v[i] * obj.v[j];
                ) {
                    res.v[i + j + ] += res.v[i + j] / ;
                    res.v[i + j] %= ;
                }
            }
        }
        int len = res.v.size();
        ] == ; --len);
        res.v.resize(len);
        return res;
    }

    BigInteger0 operator / (BigInteger0& obj) const {
        ");
        ");
        else {
            BigInteger0 res("), tmp(v);
            while(tmp > obj) {
                int lendif = tmp.v.size() - obj.v.size();
                BigInteger0 b1 = ten ^ lendif;
                BigInteger0 b2 = b1 * obj;
                if(tmp < b2) {
                    b1 = ten ^ (lendif - );
                    b2 = b1 * obj;
                }
                while(tmp >= b2) {
                    tmp = tmp - b2;
                    res = res + b1;
                }
            }
            return res;
        }
    }

    /**power*/
    BigInteger0 operator ^ (int n) const {
        BigInteger0 res("), tmp(v);
        ; n >>= ) {
            )res = res * tmp;
            tmp = tmp * tmp;
        }
        return res;
    }

    BigInteger0 sqrt() {
        ) / ;
        BigInteger0 res(len), ten(");
        ; i >= ; --i) {
            , high = , mid, bit;
            ) {
                mid = (low + high) >> ;
                BigInteger0 b = res + (BigInteger0(vector<, mid)) * (ten ^ i));
                if(b * b <= *this) {
                    low = mid;
                    bit = mid;
                }
                else high = mid;
            }
            res.v[i] = bit;
        }
        ] == ; --len);
        res.v.resize(len);
        return res;
    }

    bool operator < (const BigInteger0& obj) const {
        if(v.size() < obj.v.size())return true;
        else if(v.size() > obj.v.size())return false;
        else {
            ;
             && v[i] == obj.v[i]; --i);
            )return false;
            else return v[i] < obj.v[i];
        }
    }

    bool operator > (const BigInteger0& obj) const {
        return obj < *this;
    }

    bool operator == (const BigInteger0& obj) const {
        if(v.size() != obj.v.size())return false;
        else {
            ; i < v.size(); ++i) {
                if(v[i] != obj.v[i])return false;
            }
            return true;
        }
    }

    bool operator >= (const BigInteger0& obj) const {
        return *this > obj || *this == obj;
    }

    bool operator <= (const BigInteger0& obj) const {
        return *this < obj || *this == obj;
    }

    string value() {
        string res;
        ; i >= ; --i)res.push_back(v[i] + ');
        )res.push_back(');
        return res;
    }
} BigInteger;

 V2.0

/**
    只考虑正数[1, +∞);
    “-”运算只允许大数减小数;
    小端存储;
*/
typedef struct BigInteger0 {
    typedef long long LL;
    , BOUND = int(1e9);
    vector<LL> v;

    void trim() {
        ;
         && v[i] == ; --i);
        )v.resize(i + );
    }

    string value() {
        ];
        string res;
        trim();
        )res.push_back(');
        else {
            ; i >= ; --i) {
                )sprintf(tmp, "%I64d", v[i]);
                else sprintf(tmp, "%09I64d", v[i]);
                res += string(tmp);
            }
        }
        return res;
    }

    bool isEven(){
        ] %  == ;
    }

    BigInteger0(const vector<LL>& nv): v(nv) {}

    BigInteger0(int len) {
        v.resize(len);
    }

    BigInteger0(const char str[]) {
        int len = strlen(str);
        , cnt = , last = len;
        v.resize(cap);
        , len - BIT); i >= ; i = max(, i - BIT)) {
            LL tmp = ;
            for(int j = i; j < last; ++j) {
                tmp = tmp *  + str[j] - ';
            }
            v[cnt++] = tmp;
            last = i;
            )break;
        }
        trim();
    }

    BigInteger0 operator + (const BigInteger0& obj) const {
        BigInteger0 res(v);
        int len = max(v.size(), obj.v.size());
        res.v.resize(len + );
        ; i < len; ++i) {
            if(i < obj.v.size())res.v[i] += obj.v[i];
            if(res.v[i] >= BOUND) {
                res.v[i + ] += res.v[i] / BOUND;
                res.v[i] %= BOUND;
            }
        }
        res.trim();
        return res;
    }

    /*默认v >= obj,即v.size() >= obj.v.size()*/
    BigInteger0 operator - (const BigInteger0& obj) const {
        BigInteger0 res(v);
        ; i < v.size(); ++i) {
            if(i < obj.v.size())res.v[i] -= obj.v[i];
            ) {
                res.v[i + ]--;
                res.v[i] += BOUND;
            }
        }
        res.trim();
        return res;
    }

    BigInteger0 operator * (const BigInteger0& obj) const {
        BigInteger0 res(v.size() + obj.v.size());
        , len1 = v.size(); i < len1; ++i) {
            , len2 = obj.v.size(); j < len2; ++j) {
                res.v[i + j] += v[i] * obj.v[j];
                if(res.v[i + j] >= BOUND) {
                    res.v[i + j + ] += res.v[i + j] / BOUND;
                    res.v[i + j] %= BOUND;
                }
            }
        }
        res.trim();
        return res;
    }

    BigInteger0 divide(const BigInteger0& obj, BigInteger0& reminder){
        BigInteger0 zero(");
        if(*this < obj){reminder = *this; return zero;}
        else if(*this == obj){reminder = zero; return one;}
        else{
            BigInteger0 tmp(v), p1 = one, p2 = one, res = zero;
            while(tmp >= obj){
                p1 = one;
                while(p1 * obj <= tmp){
                    p2 = p1;
                    p1 = p1 * two;
                }
                res = res + p2;
                tmp = tmp - (obj * p2);
            }
            reminder = tmp;
            return res;
        }
    }

    BigInteger0 operator / (const BigInteger0& obj){
        BigInteger0 rem(");
        return this->divide(obj, rem);
    }

    BigInteger0 operator % (const BigInteger0& obj){
        BigInteger0 rem(");
        this->divide(obj, rem);
        return rem;
    }

    /**power*/
    BigInteger0 operator ^ (BigInteger0 n) const {
        BigInteger0 zero(");
        BigInteger0 res("), tmp(v);
        for(; n > zero; n = n / two) {
            if(!n.isEven())res = res * tmp;
            tmp = tmp * tmp;
        }
        return res;
    }

    bool operator < (const BigInteger0& obj) const {
        if(v.size() < obj.v.size())return true;
        else if(v.size() > obj.v.size())return false;
        else {
            ;
             && v[i] == obj.v[i]; --i);
            )return false;
            else return v[i] < obj.v[i];
        }
    }

    bool operator > (const BigInteger0& obj) const {
        return obj < *this;
    }

    bool operator == (const BigInteger0& obj) const {
        if(v.size() != obj.v.size())return false;
        else {
            ; i < v.size(); ++i) {
                if(v[i] != obj.v[i])return false;
            }
            return true;
        }
    }

    bool operator >= (const BigInteger0& obj) const {
        return *this > obj || *this == obj;
    }

    bool operator <= (const BigInteger0& obj) const {
        return *this < obj || *this == obj;
    }

    BigInteger0& operator = (const BigInteger0& obj) {
        v.assign(obj.v.begin(), obj.v.end());
        return *this;
    }

} BigInteger;

C++实现大正整数及其相关运算(长期更新)的更多相关文章

  1. js 时间函数 及相关运算大全

    js 时间函数 及相关运算大全 var myDate = new Date(); myDate.getYear();        //获取当前年份(2位) myDate.getFullYear(); ...

  2. Problem B: 大整数的加法运算

    Problem B: 大整数的加法运算 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 112  Solved: 57[Submit][Status][W ...

  3. 大整数加减运算的C语言实现

    目录 大整数加减运算的C语言实现 一. 问题提出 二. 代码实现 三. 效果验证 大整数加减运算的C语言实现 标签: 大整数加减 C 一. 问题提出 培训老师给出一个题目:用C语言实现一个大整数计算器 ...

  4. Python 整数和浮点数运算

    和数学运算不同的地方是,Python的整数运算结果仍然是整数,浮点数运算结果仍然是浮点数:1 + 2 # ==> 整数 31.0 + 2.0 # ==> 浮点数 3.0 整数和浮点数混合运 ...

  5. Python:Base1(数据类型,print语句,变量,定义字符串,raw字符串与多行字符串,Unicode字符串,整数和浮点数运算,布尔类型运算)

    1.Python中数据类型: 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据 ...

  6. Java代码优化(长期更新)

    前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...

  7. iOS-工作经验+资料分享(长期更新)

    在此记录工作中的一些经验和技术资料 长期更新 欢迎各位业内朋友指正.交流技术上的问题 0.苹果开发联盟电话 4006 701855 1.轻易不用使用tableViewController,因为改变他自 ...

  8. Ubuntu16.04系统美化、常用软件安装等,长期更新

    Ubuntu16.04系统美化.常用软件安装等,长期更新 IT之家啊 18-09-0915:00 因为我个人偏向于玩VPS.服务器之类的东西,所以一般我都是用CentOS.不过对于桌面版的Linux, ...

  9. Spring MVC & Boot & Cloud 技术教程汇总(长期更新)

    昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ ...

随机推荐

  1. SQL语句主要的分类

    SQL语言的命令通常分为四类1.数据定义语言(DDL) 创建.修改或删除数据库中各种对象,包括表.视图.索引等. 命令:CREATE TABLE , CREATE VIEW, CREATE INDEX ...

  2. js 获取地址栏域名以及URL

    console.log(window.location.host) console.log(document.domain) console.log(window.location.href) con ...

  3. zookeeper和Eureka对CAP理论的支持

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡.在此Zookeeper保证 ...

  4. php多站点配置以及Forbidden You don't have permission to access / on this server问题解决

    php多站点配置以及Forbidden You don't have permission to access / on this server问题解决 一.总结 一句话总结:我的问题是php的版本问 ...

  5. ibatis.net 实现多数据库配置

    1.1  功能介绍 使用ibatis.net ORM框架时,有时候需要操作多个数据库,同时有时候也需要对连接数据库信息进行加密,本文通过将配置连接写到Web.config中, 这样就可以在Web.co ...

  6. UVA-11613 Acme Corporation (最大费用最大流+拆点)

    题目大意:有一种商品X,其每每单位存放一个月的代价I固定.并且已知其每月的最大生产量.生产每单位的的代价.最大销售量和销售单价,还已知每个月生产的X能最多能存放的时间(以月为单位).问只考虑前m个月, ...

  7. IOS-更优雅地使用Static Cell

    更优雅地使用Static Cell 在项目开发中,经常会用到static cell来实现一些固定的列表界面(如:个人中心等),在static cell被点击时,如何判断被点击的cell是哪一个,有什么 ...

  8. HP-UX 下用户被锁

    /usr/lbin/getprpw -m lockout root 如果返回lockout=0000000 该帐号是非锁定的,如果是其它的如:lockout=0001000则表示该帐号被锁定 如果是测 ...

  9. Struts2基本使用(三)--数据交互

    Struts2中的数据交互 在Struts2中我们不必再使用request.getParameter()这种方式来获取前台发送到服务器的参数. 我们可以在服务器端的Java类中直接声明一个和前台发送数 ...

  10. kubernetes1.7新特:kubectl支撑中文字符集

    背景介绍 在Kubernetes架构图中可以看到,节点(Node)是一个由管理节点委托运行任务的worker. 它能运行一个或多个Pods,节点(Node)提供了运行容器环境所需要的所有必要条件,在K ...