当前位置: 首页 > 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

  • 更加丰富的测试样例
  • 加减乘除未兼容普通整数
  • 大数除法中的负数的商不是最小非负余数
http://www.lryc.cn/news/543274.html

相关文章:

  • 在 macOS 系统上安装 kubectl
  • 【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元
  • 构建数据治理闭环:DAMA视角下的全流程实践与价值变现
  • 《深度剖析:AI与姿态估计技术在元宇宙VR交互中的应用困境》
  • 【Python LeetCode】面试经典 150 题
  • 2011-2019年各省乡镇综合文化站机构数数据
  • LeetCode 热题100 226. 翻转二叉树
  • mysql 拼接多行合并为一行
  • 【Java项目】基于Spring Boot的论坛管理系统
  • unity学习54:图片+精灵+遮罩mask,旧版文本 text 和新的TMP文本
  • 2024年国赛高教杯数学建模D题反潜航空深弹命中概率问题解题全过程文档及程序
  • 什么是数字人
  • 15.5 基于 RetrievalQA 的销售话术增强系统实战:构建智能销售大脑
  • 软件供应链安全工具链研究系列—RASP自适应威胁免疫平台(下篇)
  • WordPress网站502错误全面排查与解决指南
  • PCL源码分析:曲面法向量采样
  • HTTP 动态报错码的原因和解决方法
  • 1分钟用DeepSeek编写一个PDF转Word软件
  • 生成对抗网络(GAN)
  • openlayers结合turf geojson面获取面积和中心点
  • 【SRC实战】修改金币数量实现财富自由
  • 地理数据可视化:飞线说明(笔记)
  • 2024最新版鸿蒙纯血原生应用开发教程文档丨学习ArkTS语言-基本语法
  • 微信小程序-二维码绘制
  • 轻量化网络设计|ShuffleNet:深度学习中的轻量化革命
  • 一天记20个忘10个之五:land
  • Python 类(创建和使用类)
  • LeetCode 解题思路 3(Hot 100)
  • 算法-二叉树篇11-左叶子之和
  • MaxKB上架至阿里云轻量应用服务器镜像市场