当前位置: 首页 > news >正文

C++大整数类的设计与实现

1. 简介

我们知道现代的计算机大多数都是64位的,因此能处理最大整数为 2 64 − 1 2^{64}-1 2641。那如果是超过了这个数怎么办呢,那就需要我们自己手动模拟数的加减乘除了。

2. 思路

我们可以用一个数组来存储大数,数组中的每一个位置表示一个数位。为了方便,我们直接用 S T L STL STL中的vector来存。

2.1 大数加法

我们需要把两个大数的最低位对齐,然后再开始相加。唯一需要注意的是处理一下最高位置的进位置。

2.2 大数减法

大数减法跟加法不一样的是,我们需要处理相减后的前导0,因为有可能出现相减为0的情况。处理前导0只需要从最高位开始到第2位的连续0。

2.3 大数乘法

大数乘法与加法不同的是,每次相乘后放到相应的位置而不是相乘的位次本身。

2.4 大数除法

大数除法是最难的,我们用减法进行模拟。

假设两个大数为 a   b a\ b a b a a a为除数, b b b为被除数。

我们每次需要找到最接近被除数的除数的进制次倍数 m m m

D 0 : = { d : a × 1 0 d ≤ b } d 0 = max ⁡ { D 0 } m 0 = a × 1 0 d 0 D_0 := \{d: a\times 10^d \le b\}\\ d_0 =\max \{D_0\}\\ m_0=a \times 10^{d_0} D0:={d:a×10db}d0=max{D0}m0=a×10d0
通过大数减法算出 t 0 = ⌊ b / m 0 ⌋ t_0 =\lfloor b/m_0 \rfloor t0=b/m0, 因此商需要加上 a n s = a n s + t 0 1 0 d 0 ans = ans +t_010^{d_0} ans=ans+t010d0

此时余数为 b 1 b_1 b1,如果 b 1 < a b_1<a b1<a,说明我们的除法做完了,否则令 b = b 1 b=b_1 b=b1, 继续重复上面的过程直到 b k < a b_k <a bk<a

2.5 符号问题

我们在加减乘除的时候,

可以将符号问题单独考虑。

因此可以写一个绝对值的大数相加,还有一个版本

的一个大的大数减一个小的大数的大数减法。

而至于乘除法的符号问题比较容易处理,因此可以

一同处理符号的问题。

3. 实现

放在gitee上了。

4. TODO

  • 更加丰富的测试样例
  • 加减乘除未兼容普通整数
  • 大数除法中的负数的商不是最小非负余数

相关文章:

  • 点云配准技术的演进与前沿探索:从传统算法到深度学习融合(2)
  • 【Grok3】强化学习(Reinforcement Learning, RL)复习文档
  • Python 编程题 第二节:组合数字、乘法口诀表、水仙花数、反向输出四位数、判断三角形
  • 蓝桥杯 五子棋对弈
  • AI人工智能机器学习之神经网络
  • 人工智能丨大语言模型不再高不可攀!DeepSeek开源FlashMLA,开启AI新纪元
  • 验证码介绍及生成与验证(HTML + JavaScript实现)
  • 组件注册方式、传递数据
  • 实体机器人识别虚拟环境中障碍物
  • Layui页面粘贴的方法
  • python整理文件下
  • 对 flask 框架中的全局变量 request 探究
  • SQL_优化
  • JavaScript算法-合并两个有序链表
  • 多进程网络服务端详细说明文档
  • 计算机工具基础(五)——Vim
  • LeetCode 解题思路 3(Hot 100)
  • 操作定制万年历投屏模拟点单叫号器
  • 【机器学习】 [代码篇] 30. KNN - sklearn 以及 自定义KNN 的实现
  • 【Elasticsearch】script_fields 和 runtime_fields的区别
  • 首开股份:一季度净利润亏损约10.79亿元,签约金额63.9亿元
  • 五大国货美妆去年业绩分化:珀莱雅百亿营收领跑,上海家化转亏
  • 医学统计专家童新元逝世,终年61岁
  • 魔都眼|静安光影派对五一启幕:苏河湾看徐悲鸿艺术画作
  • 马上评丨准入壁垒越少,市场活力越足
  • 对话|贝聿铭设计的不只是建筑,更是生活空间