C++ 大整数类(支持上亿个位的整数 '+'、'-'、'*'、'/'、'%'、'^' 计算实现)

C++ 大整数类(支持上亿个位的整数 '+'、'-'、'*'、'/'、'%'、'^' 计算实现)


设计这个类的初衷,来自一次面试,第一个加数是1后面接一千个0,第二个加数是2后面接一千个0,描述这两个数相加的过程,而 int 类型的范围是-2147483648~2147483647,只能接9个0,unsigned long long int 类型也只能保存最大 18446744073709551615,1后面接19个0,远远无法满足需求,于是需要设计一个类来保存大整数的每一位。

LagerData类,包含两个成员变量,bool类型变量保存整数的正负号,char*类型变量指向一个字符串,字符串中保存每一位数字。

此类运用了大量C++的基础语法,无参构造、数值构造,数字字符串构造、拷贝构造、各种操作符重载、友元函数重载、使 string 类型变量可以像 stringstream 类型一样级联式输出,将数据级联式输出到 LagerData 类中

LagerData类的头文件声明如下:


class LagerData
{
   

private:

    bool	m_sign;
    char*	m_point;
    
public:
    
    // 默认构造函数
    LagerData(int num = 0, size_t length = 0);

    // 字符串形式构造
    LagerData(char const* pNum, size_t len);

    // 拷贝构造函数
    LagerData(LagerData const& that);

    // 析构函数
    virtual ~LagerData();

    // 非负数判断,非负数返回true,负数返回false
    bool nonnegative() const;

    // 负数判断,负数返回true,非负数返回false
    bool negative() const;

    // 返回该数据的长度(从数字首位开始计数,首位是0也会计数)
    size_t size() const;

    // 第一位有效数字(不为0的数)的索引号
    size_t const firstvalid() const;

    // 有效数字的个数
    size_t const validnum() const;

    // 将数字规格化,将数字前面的0去除,不是常对象的返回自身引用
    LagerData& regularization();

    // 将数字规格化,将数字前面的0去除,常对象的返回一个规格化后的常对象
    LagerData const regularization() const;

    // 打印每一位数字信息
    void print();

    // 方括号重载,返回下表位置的数值,不是常对象的返回该位置引用,可修改
    char& operator[](int index);

    // 方括号重载,返回下表位置的数值,常对象的返回常量字符,不可修改数据对象本身
    char const operator[](int index) const;

    // ==号操作符重载,判断两个大数据是否相等
    bool operator==(LagerData const& that) const;

    //  !=号操作符重载,判断两个大数据是否不相等
    bool operator!=
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我知道了。关于您的问题,可以使用结构体和字符数组来实现整数的输入、输出、加减乘除等运算,具体实现如下: ```c #include <stdio.h> #include <string.h> #define MAXN 1000 typedef struct BigInteger { int len, s[MAXN]; BigInteger() { memset(s, 0, sizeof(s)); len = 1; } BigInteger(const char* num) { memset(s, 0, sizeof(s)); int L = strlen(num); len = L; for (int i = 0; i < L; i++) s[i] = num[L - i - 1] - '0'; } BigInteger operator=(const char* num) { memset(s, 0, sizeof(s)); int L = strlen(num); len = L; for (int i = 0; i < L; i++) s[i] = num[L - i - 1] - '0'; return *this; } BigInteger operator=(int num) { char s[MAXN]; sprintf(s, "%d", num); *this = s; return *this; } BigInteger operator+(const BigInteger& b) const { BigInteger c; c.len = 0; for (int i = 0, g = 0; g || i < max(len, 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; } BigInteger operator-(const BigInteger& b) const { BigInteger c; c.len = 0; for (int i = 0, g = 0; i < len; i++) { int x = s[i] - g; if (i < b.len) x -= b.s[i]; if (x >= 0) { g = 0; } else { g = 1; x += 10; } c.s[c.len++] = x; } while (c.len > 1 && c.s[c.len - 1] == 0) c.len--; return c; } BigInteger operator*(const BigInteger& b) const { BigInteger 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; } while (c.len > 1 && c.s[c.len - 1] == 0) c.len--; return c; } BigInteger operator/(const BigInteger& b) const { BigInteger c; c.len = len - b.len + 1; if (c.len < 0) { c.len = 1; return c; } BigInteger temp = *this; for (int i = c.len - 1; i >= 0; i--) { BigInteger r("0"); r.s[0] = temp.s[i + b.len]; while (r >= b) { r = r - b; c.s[i]++; } c.s[i] = c.s[i] % 10; BigInteger t("1"); t = t * pow(10, i); r = b * c.s[i]; temp = temp - r * t; } while (c.len > 1 && c.s[c.len - 1] == 0) c.len--; return c; } bool operator<(const BigInteger& b) const { 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 BigInteger& b) const { return b < *this; } bool operator<=(const BigInteger& b) const { return !(b < *this); } bool operator>=(const BigInteger& b) const { return !(*this < b); } bool operator!=(const BigInteger& b) const { return b < *this || *this < b; } bool operator==(const BigInteger& b) const { return !(b < *this) && !(b > *this); } void print() { for (int i = len - 1; i >= 0; i--) printf("%d", s[i]); } } BIGINT; int main() { char num1[MAXN], num2[MAXN]; scanf("%s%s", num1, num2); BIGINT a(num1), b(num2); printf("a - b = "); (a - b).print(); printf("\na * b = "); (a * b).print(); printf("\na / b = "); (a / b).print(); printf("\n"); return 0; } ``` 以上代码中,我们使用了结构体 `BigInteger` 代表大整数,其中 `s` 数组存储各数字,`len` 表示整数数。同时,我们还定义了加减乘除等运算符号,可以直接使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值