自己写的c++大整数计算BigInt类

算法使用vector保存变量,使用一个flug来保存正负。
重载的运算符有 + - * += -= *= 还有string类型转换运算符,<<输出运算符
构造函数有默认构造函数(0),从string构造(支持开头有无限个-号,但不支持正号),从BigInt构造,从long long构造(从而可以支持大多数c++的基本类型)
基本原理和手工列竖式差不多,简单测试了几组数据没问题。
因为个人经验有限,对const的设置把握不太好,不过应该可以应对大多数情况。
采用的是万进制,这样可以比较方便的计算乘法进位,单位数据使用_Uint32_t类型以方便移植(如果系统不支持这个类型,自己定义#define _Uint32_t long long,但注意long long可能属于c++11)
class里面枚举常量max是进制单位,znum是max中0的数量,因为string转换的原因只能使用10的整数倍进制,并且要max平方对于_Uint32_t不溢出。
乘法采用的也是列竖式的方法,从10进制推广到了max进制。
其他编译器出了些问题,测试用的vs,如果提示sprintf找不到请include一下stdio.h。
并未作完全测试,做过简单的测试,应该可以正常使用。

#include <iostream>

#include <vector>
#include <string>
using namespace std;
class BigInt{
private:
    enum{ max = 10000, znum = 4 };
    vector<_Uint32t> datarr;//这里用小端模式
    bool flug;//正负
public:
    /*
    * 构造函数:
    * 默认构造函数 0
    * 从long long来构造一个BigInt
    * 从string来构造一个BigInt
    * 从BigInt来构造一个BigInt
    * */
    BigInt() :datarr(1, 0),flug(true){}
    BigInt(BigInt & bigInt) :datarr(bigInt.datarr), flug(bigInt.flug){}
    BigInt(long long num) :datarr(32 / znum), flug(true){
        int i = 0;
        while (num != 0){
            datarr[i++] = num%max;
            num /= max;
        }
    }
    BigInt(const string & num) :datarr(num.size() / znum + (num.size() % znum == 0 ? 0 : 1), 0), flug(true){
        size_t i = 0, nsize = num.size();
        if (nsize == 0)
            return;
        if (num[0] == '-')
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值