大数加减类的实现(C++实现)✨
这篇文章以一个可运行的 BigInteger 类为主线,系统讲解了如何用字符数组模拟大整数,并通过符号分类讨论实现稳定的加减运算。设计目标与对象模型先回答“为什么要大数模拟”:内置整数有范围上限,竞赛与工程都存在高精度需求。类的核心状态包括符号位、数字数组、长度与容量,构成了最小可用的数据模型。构造、拷贝、移动、析构配…
为什么需要大数加减类? 对于计算机而言,基本的数据类型一般最多为64位数据表示范围,这个范围是有限的,没法无限的表示所有的数据,那么有没有一种方式能够表示所有的大数,并完成加减乘除呢? 答案肯定是有的,由于数据都是由一位一位的数字所组成,我们只需要用数组中的每一位表示一位数字,便可完成对大数的模拟了。 那么我们说明时候需要用到大数模拟呢?对竞赛人而言,有很多题目实际上就是高精度大数模拟类型,而对于普通的程序员而言,大数模拟也仅是在做某个逻辑运算而保证不会溢出的最佳策略,那么大家难道不好奇如何实现一个大数模拟类吗? 现在就从封装一个简单的加减类开始了解这样一个大数模拟是怎么实现的👀大数加减类实现详解一、流程图总览 如图总体来说分为五部分:静态成员函数:属于类的公共接口(核心)构造和析构函数:构造对象以及析构对象成员数据:用于运算的数据以及表示对象的数据运算符重载:用于自定义运算方式(核心)内部成员函数:属于对象的公共接口二、成员数据和构造函数详解成员数据 bool f; //是否是负数的标记 char *nums; //存储非符号的大数各个位 int length; //nums的数据长度 int capacity; //nums的可用容量 构造和析构//缺省构造函数 BigInteger() : length(0), capacity(1), f(false) { nums = new char[capacity]; } //用于转化普通字符串的构造函数 BigInteger(const char *n) : length(strlen(n)), f(false) { int start = 0; if (n[0] == '-') { f = true; start++; } while (start<length&&n[start] == '0')start++; capacity = length * 10; nums = new char[capacity]; std::copy(n + start, n + length, nums); length = length - start; } //拷贝构造函数 BigInteger(BigInteger &a) { capacity = a.capacity; length = a.length; f = a.f; nums = new char[capacity]; std::copy(a.nums, a.nums + length, nums); } //移动构造函数:这里调用了等于号,根据a的类型来决定用哪个等于号 BigInteger(BigInteger &&a) :length(0){ *this = a; } //析构函数 ~BigInteger() { delete[] nums; } 三、(算法核心)静态成员函数和运算符重载详解static Swap()//调用std的swap实现对基本数据的交换 static void Swap(BigInteger &a, BigInteger &b) { std::swap(a.length, b.length); std::swap(a.capacity, b.capacity); std::swap(a.f, b.f); std::swap(a.nums, b.nums); } static compare()//不看符号比较nums的大小:表示a是否比b大 static bool compare(const BigInteger &a,const BigInteger &b) { //比较纯nums大小(不看符号 int n1 = a.length; int n2 = b.length; if (n1 != n2)return n1 > n2; //返回a和b哪个大,true则位a大 int i = 0; while (i < n1 && a.nums[i] == b.nums[i])i++; //a b一样长的情况下,比较两个的值 if (i == n1) return false; return a.nums[i] > b.nums[i]; } static isEqual()//表示a和b是否相等 bool isEqual(BigInteger &a, BigInteger &b) { if (a.f != b.f || (a.length != b.length))return false; int i = 0; while (i < a.length && a.nums[i] == b.nums[i])i++; return i == a.length && a.f == b.f; } (*核心算法…
正在初始化 WebAssembly 引擎…
首次编译原生模块可能需要数秒
就绪后,页面交互将以接近原生的速度运行