C++大整数

这两天一直在利用一些课余的琐碎时间在写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] 
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值