这两天一直在利用一些课余的琐碎时间在写C++大整数,昨天晚上终于基本完工了,利用到的思想就是:
用一个连续的int型的存储空间去表示大整数和进行运算。在运算时将该大整数拆分成一个多项式,然后按照
多项式的规则进行运算,最后在输出显示该大整数时再将该大整数的每一项进行调整到0到9之间。本程序的
缺点就是存储空间利用率较低,有待优化的地方还很多。嗯。。等过几天有时间了再来优化吧。
BigInt.h
#pragma once
#include<iostream>
const int LIST_INIT_SIZE =100; //初始分配量
const int LISTINC = 30; //增长量
using namespace std;
class BigInt
{
public:
//链表扩充函数
bool EnlargeList();
BigInt(void);//初始化一个空的大整数
BigInt(int p[],int n,bool IsPN);//用int(值为0到9之间)的数组初始化一个大整数,n代表数组长度,IsPN表示是否为正数
BigInt(char p[],int n,bool IsPN);//用字符数组初始化一个大整数
BigInt(BigInt &);//复制构造函数
BigInt(int);//用int型数据初始化一个大整数
int GetSize()const {return size;}//返回该大整数的位数
void SetSize(int t){size = t;}
int GetSign() const {return sign;}//返回该大整数的符号位
void SetSign(int t){sign = t;}
int * GetEP(){return elem;}//返回数据区的指针
int GetFirste(){return firste;}//返回
void SetFirste(int t){firste = t;}//设置第一个非零系数项的指数
int GetCapacity(){return capacity;}
BigInt & operator=(BigInt&);//赋值操作符重载
friend ostream& operator<<(ostream& os,BigInt & bit ); //输入输出流重载,不是类的成员
// 调整系数项的函数
void Juist();
//两个大整数相加
friend BigInt operator+(BigInt&,BigInt&);
//两个大整数相减
friend BigInt operator-(BigInt&,BigInt&);
//两个大整数相乘
friend BigInt operator*(BigInt&,BigInt&);
//两个大整数相除(只取整数商部分
friend BigInt operator/(BigInt&,BigInt&);
//两个大整数取余运算
friend BigInt operator%(BigInt&,BigInt&); //只针对正数之间的取余
//两个大整数相加等
BigInt& operator+=(BigInt&);
//两个大整数相减等
BigInt& operator-=(BigInt&);
//两个大整数相乘等
BigInt& operator*=(BigInt&);
//两个大整数相除等(只取整数商部分
BigInt& operator/=(BigInt&);
//大整数与int型数据相加
friend BigInt operator+(BigInt&,int);
//大整数与int型数据相减
friend BigInt operator-(BigInt&,int);
//大整数与int型数据相乘
friend BigInt operator*(BigInt&,int);
//大整数与int型数据相除
friend BigInt operator/(BigInt&,int);
//大整数与int型数据取余运算
friend BigInt operator%(BigInt&,int); //只针对正数之间的取余
//大整数与int型数据相加等
BigInt& operator+=(int);
//大整数与int型数据相减等
BigInt& operator-=(int);
//大整数与int型数据相乘等
BigInt& operator*=(int);
//大整数与int型数据相除等
BigInt& operator/=(int);
//两个大整数之间的关系运算
bool operator<(BigInt&);
bool operator>(BigInt&);
bool operator==(BigInt&);
bool operator!=(BigInt&);
bool operator<=(BigInt&);
bool operator>=(BigInt&);
//大整数与int型数据关系运算
bool operator<(int);
bool operator>(int);
bool operator==(int);
bool operator!=(int);
bool operator<=(int);
bool operator>=(int);
~BigInt(void);
private:
int *elem;//连续存储空间的指针
int size;//大整数的位数
int capacity;//连续存储空间的大小
int firste;//第一个非0系数项数据对应的指数项 --- 默认指数项系数为从大到小排列的
int sign;//符号位,其中1代表正数,-1代表该大整数为负数
void clear();//清空一个大整数
};
BigInt.cpp
#include "BigInt.h"
#include<stack>
#include<iostream>
using namespace std;
BigInt::BigInt(void)
{
elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int));
capacity = LIST_INIT_SIZE;
size = 0;
firste = 0;
sign = 1;
}
BigInt::BigInt(int pd[],int n,bool IsPN)//用int数组初始化一个大整数
{
elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int));
capacity = LIST_INIT_SIZE;
size = 0;
firste = n-1;
if(IsPN)
{
sign = 1;
}
else
{
sign = -1;
}
for(int i = 0;i<n;i++)
{
if(size>=capacity)//如果容量不够则进行扩充
{
EnlargeList();
}
elem[i] = pd[i];
size++;
}
}
BigInt::BigInt(char pd[],int n,bool IsPN)//用字符数组初始化一个大整数
{
elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int));
capacity = LIST_INIT_SIZE;
size = 0;
firste = n-1;
if(IsPN)
{
sign = 1;
}
else
{
sign = -1;
}
int i =0;
for(;i<n;i++)
{
if(size>=capacity)//如果容量不够则进行扩充
{
EnlargeList();
}
if(pd[i]<'0'||pd[i]>'9')
{
throw range_error("字符数组异常");//抛出字符数组异常
}
elem[i]