char是8位的,short是16位的,int是32位的,最大的long long是64位的,也就是说基本的数据类型无法表示超过2的64次方-1的数
如今又到了找工作的时候了,面试手撕题少不了,听说这个手搓大整数也有过面试题,这里先搓一手,免得以后执手相看泪眼
其实Java有这个大整数类,手搓大整数类可以说是一个比较综合的应用,需要使用到重载运算符,包括输入输出、四则运算等等,还需要字符串的运算,其中比较运算符的实现是十分巧妙的,这里的思维应用、逻辑运算都是很好的训练,这里只实现了大整数相加的功能,源码已开源在MaolinYe/BigInteger: 使用C++11实现的一个大整数类 (github.com)
欢迎大家指正修改
目录
基本思路
实现大整数有两种方法,一种是将大数当成字符来处理,手动计算加减乘除,另一种则是将大数分成多个小部分用基本类型存储处理
我们这里实现第二种方法的,目前版本是支持非负整数
基本思路是将一个大整数切分成几段小的用int存储,用vector容器来存储每段,例如
1111222233334444 integer[1]=11112222 integer[0]=33334444
重载赋值运算符
重载赋值运算符,实现从基本数据类型到大整数的转换,通过和base取余切分出段
class BigInteger {
static const int width = 8; // 切分段的长度
static const int base = 1e8; // 切分段的数量级
vector<int> integer; // 存储各个段
int segments = 0; // 切分的段数
BigInteger operator=(long long num) { // 重载赋值运算符,从基本数据类型转换大整数存储
integer.clear();