C++超大数相加,大神错过

#include <iostream>
#include <cstring>
using namespace std;
 
//声明超大数类
class BigNum
{
private:
	char *pszNnum;
	int length;
public :
	BigNum();
	BigNum(const char *);
	BigNum(const BigNum & bigNum);
	virtual ~BigNum();
	int Display();
	BigNum operator + (BigNum);
	BigNum & operator = (BigNum);
};
 
BigNum & BigNum::operator = (BigNum bigNum)
{
	this->length = bigNum.length;
	delete this->pszNnum;
	this->pszNnum = new char[this->length+1];
 
	for(int i = 0; i< this->length; i++)
	{
		this->pszNnum[i] = bigNum.pszNnum[i];
	}
	this->pszNnum[length]='\0';
	return *this;
}
 
//默认构造函数
BigNum::BigNum()
{
	this->length = 0;
	this->pszNnum = NULL;
}
 
//构造函数初始化
BigNum::BigNum(const char *bigNum)
{
	this->length = strlen(bigNum);
	pszNnum = new char[length+1];
	for(int i=0; i<length; i++)
	{
		this->pszNnum[i] = bigNum[length-1-i];
	}
	this->pszNnum[length] = '\0';
 
}
 
//重写复制构造函数
BigNum::BigNum(const BigNum & bigNum)
{
	this->length = bigNum.length;
	this->pszNnum = new char[this->length+1];
	for(int i = 0;i < this->length; i++)
	{
		this->pszNnum[i] = bigNum.pszNnum[i];
	}
	this->pszNnum[length] = '\0';
}
 
//打印超大数
int BigNum::Display()
{
	for(int i = length-1;i >= 0 ;i--)
	{		
		cout << this->pszNnum[i] ;		
	}
	cout << endl;
	return this->length;
}
 
//重载运算符,两个超大数相加
BigNum BigNum::operator + (BigNum bigNum)
{
	char * pszTem;
 
	int nSize = max(this->length, bigNum.length);  
	int minLength = min(this->length, bigNum.length); //取最小数组大小,用于for循环相加
 
	pszTem = new char[nSize+2];
	int carry = 0;
	int i;
	for(i = 0;i < minLength; i++)
	{
		carry = this->pszNnum[i] - '0' + bigNum.pszNnum[i] - '0' + carry;
		pszTem[i] = carry % 10 + '0';
		carry /= 10;
	}
 
	for (; i < this->length; i++ ) 
	{
		carry = this->pszNnum[i] - '0' + carry;
		pszTem[i] = carry % 10 + '0';
		carry /= 10;
	}
 
	for (; i < bigNum.length; i++ )
	{
		carry = bigNum.pszNnum[i] - '0' + carry;
		pszTem[i] = carry%10 + '0';
		carry /= 10;
	}
 
	if (carry != 0) //判断是否最后进位的情况
	{
		pszTem[i] = carry + '0';
		pszTem[i+1] = '\0';
		this->length = nSize + 1;
	}
	else
	{
		pszTem[i] = '\0';
		this->length = nSize ;
 
	}
	delete this->pszNnum;
 
	this->pszNnum = pszTem;
	
	return *this;
 
}
 
BigNum::~BigNum()
{
 
}
 
int main()
{
	BigNum bigNum_1("99999999999999999999999999999999999999999999999999999999999999999999888888888888");
 
	bigNum_1.Display();
 
	BigNum bigNum_2("1999999999999999999999999999999999999999999999999999999999997777777777777777777");
 
	bigNum_2.Display();
 
	bigNum_1=bigNum_2+bigNum_1;
 
	bigNum_1.Display();
 
	int wait;
	cin >> wait;
	return 0;
}

转载于:https://www.cnblogs.com/ganquanfu2008/p/3154856.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值