算法使用vector保存变量,使用一个flug来保存正负。
重载的运算符有 + - * += -= *= 还有string类型转换运算符,<<输出运算符
构造函数有默认构造函数(0),从string构造(支持开头有无限个-号,但不支持正号),从BigInt构造,从long long构造(从而可以支持大多数c++的基本类型)
基本原理和手工列竖式差不多,简单测试了几组数据没问题。
因为个人经验有限,对const的设置把握不太好,不过应该可以应对大多数情况。
采用的是万进制,这样可以比较方便的计算乘法进位,单位数据使用_Uint32_t类型以方便移植(如果系统不支持这个类型,自己定义#define _Uint32_t long long,但注意long long可能属于c++11)
class里面枚举常量max是进制单位,znum是max中0的数量,因为string转换的原因只能使用10的整数倍进制,并且要max平方对于_Uint32_t不溢出。
乘法采用的也是列竖式的方法,从10进制推广到了max进制。
其他编译器出了些问题,测试用的vs,如果提示sprintf找不到请include一下stdio.h。
并未作完全测试,做过简单的测试,应该可以正常使用。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class BigInt{
private:
enum{ max = 10000, znum = 4 };
vector<_Uint32t> datarr;//这里用小端模式
bool flug;//正负
public:
/*
* 构造函数:
* 默认构造函数 0
* 从long long来构造一个BigInt
* 从string来构造一个BigInt
* 从BigInt来构造一个BigInt
* */
BigInt() :datarr(1, 0),flug(true){}
BigInt(BigInt & bigInt) :datarr(bigInt.datarr), flug(bigInt.flug){}
BigInt(long long num) :datarr(32 / znum), flug(true){
int i = 0;
while (num != 0){
datarr[i++] = num%max;
num /= max;
}
}
BigInt(const string & num) :datarr(num.size() / znum + (num.size() % znum == 0 ? 0 : 1), 0), flug(true){
size_t i = 0, nsize = num.size();
if (nsize == 0)
return;
if (num[0] == '-')