`
Qaohao
  • 浏览: 261654 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

C++之大整数相加

阅读更多
    好久没有用过c++写代码了,自从工作一直都用的是java,今天有空就写了端代码,放在自己博客里面晒晒。
    自己用c++封装了一个bigDecimal类,里面实现了大整数相加的操作,目前不支持负数相加。
    代码如下:
/**************************************************************************************************************
 * Class    : bigDecimal
 * Function : It mainly processes math logical for bigDecimal, such as add, minus, mutiply, divide and ect.
 *            There only presents add operation for bigDecimal ,other to do in future.
 * Author   : qaohao
 * Version  : 1.0
 * Date     : Sep 17th, 2009.
 *
 **************************************************************************************************************/

#include<iostream>

// assign buffer size for console input.
const int IN_STREAM_BUFFER_SIZE = 1000;

const int OK= 0;
const int ERR_CODE_NULL= 1;
const int ERR_CODE_NOTHING =2;
const int ERR_CODE_UNSUPPORT_NUM =3;


/**************************************************************************************************************
 *   Class define part
 **************************************************************************************************************/
class bigDecimal
{
public:
	bigDecimal(void);
	bigDecimal(const char* decimal);
	~bigDecimal(void);
	bigDecimal& operator+(const bigDecimal& rDecimal);
	friend std::ostream& operator<<(std::ostream& os, const bigDecimal& decimal);
	friend std::istream& operator>>(std::istream& is, bigDecimal& decimal);
private:
	int bits;
	char* contents;
	int validate(const char* input);
	void throwExp(int errCode);
};


/**************************************************************************************************************
 *   Class Implementation part
 **************************************************************************************************************/

/*
 * create an bigDecimal with its content is 0.
 */
bigDecimal::bigDecimal(void)
{	
	this->contents = new char[2];
	*this->contents = '0';
	*(this->contents+1) = '\0';
	this->bits = 1;
}

/*
 * create an bigDecimal with its content is decimal char sequence.
 */
bigDecimal::bigDecimal(const char *decimal) {
	int errCode = this->validate(decimal);
	if (errCode!=OK) {
		this->throwExp(errCode);
	}
	this->bits = strlen(decimal);
	this->contents = new char[bits];
	strcpy(this->contents,decimal);
}

/*
 * release its memory, which called by compiler.
 */
bigDecimal::~bigDecimal(void)
{
	delete []contents;
}

/*
 * add two bigDecimal, return its total.
 */
bigDecimal& bigDecimal::operator +(const bigDecimal &rDecimal) {
	
	// calculate max number of bits for total, and set maxBits more than it 1. 
	int maxBits;
	if (this->bits > rDecimal.bits) {
		maxBits = this->bits + 1;
	} else {
		maxBits = rDecimal.bits + 1;
	}

	char* total = new char[maxBits+1];
	*(total+maxBits)='\0';
 
	bool carry = false;
	int lNum,rNum,lNumBitCnt=1,rNumBitCnt=1;
	
	// calculate total of big decimals.
	for (int cnt=1;cnt<maxBits;cnt++) {
		
		// lNum has added the highest bit.
		if (lNumBitCnt > this->bits) {
			lNum = 0;
		} else {
			lNum = *(this->contents + this->bits - lNumBitCnt) - '0';
		}
		
		// rNum has added the highest bit.
		if (rNumBitCnt > rDecimal.bits) {
			rNum = 0;
		} else {
			rNum = *(rDecimal.contents + rDecimal.bits - rNumBitCnt) - '0';
		}

		/*
		 * when there is a carry at highest bit, return an bigDecimal which directly instanciates by total char sequence. 
		 * Else, return an bigDecimal by char sequence which omits the first char of total.
		 */
		if (carry) {
			*(total+maxBits-cnt) = (rNum + lNum + 1)%10 + '0';
			carry = (rNum + lNum + 1)/10 != 0;
		} else {
			*(total+maxBits-cnt) = (rNum + lNum)%10 + '0';
			carry = (rNum + lNum)/10 != 0;
		}

		rNumBitCnt++;
		lNumBitCnt++;
	
	}
	
	bigDecimal* totalDecimal;
	// has carry bit at lower bit when adding.
	if (carry) {
		*total = '1';
		totalDecimal = new bigDecimal(total);
	} else {
		totalDecimal = new bigDecimal(total+1);
	}
	delete[] total;

	return *totalDecimal;

}

/*
 * validate input char sequence.
 * if input is null, return ERR_CODE_NULL,
 * if input is none, return ERR_CODE_NOTHING,
 * if input contains illegal characters(beside 0-9), return ERR_CODE_UNSUPPORT_NUM,
 * other, return OK.
 */
int bigDecimal::validate(const char* input) {
	if (input == NULL) {
		return ERR_CODE_NULL;
	}
	
	int len = strlen(input);	
	if (len==0) {
		return ERR_CODE_NOTHING;
	}

	for (int cnt=0;cnt<len;cnt++) {
		char c = *(input+cnt);
		if(c<'0'||c>'9') {
			return ERR_CODE_UNSUPPORT_NUM;
		}
	}

	return OK;
}

/*
 * throw exception to client when error occurs.
 */
void bigDecimal::throwExp(int errCode) {
	char* msg = NULL;
	switch(errCode) {
		case ERR_CODE_NULL:
			msg = "Warning!Passing parameter for bigDecimal is null.";
			break;
		case ERR_CODE_NOTHING:
			msg = "Warning!Passing parameter for bigDecimal is none.";
			break;
		case ERR_CODE_UNSUPPORT_NUM:
			msg = "Warning!Passing parameter for bigDecimal has illegal character.";
			break;
		default:;
	}
	if (msg) {
		throw std::exception(msg);
	}
}

/*
 * override output operator '<<' to print bigDecimal directly on console.
 */
std::ostream& operator <<(std::ostream &os, const bigDecimal& decimal) {
	os << decimal.contents;
	return os;
}

/*
 * override input operator '>>' to read bigDecimal directly on console. 
 */
std::istream& operator>>(std::istream& is, bigDecimal& decimal) {
	char* buf = new char[IN_STREAM_BUFFER_SIZE];
	is>>buf;
	int errCode = decimal.validate(buf);
	if(errCode!=OK){
		decimal.throwExp(errCode);
	}
	decimal.bits = strlen(buf);
	decimal.contents = new char[decimal.bits+1];
	strcpy(decimal.contents, buf);
	delete[] buf;
	return is;
}

/**************************************************************************************************************
 *   Main
 **************************************************************************************************************/
int main(void) {
	char key='y';
	while (key=='y') {
		try {
			bigDecimal a,b;
			std::cout<<"Input left operated decimal: ";
			std::cin>>a;
			std::cout<<"Input right operated decimal: ";
			std::cin>>b;
			std::cout<<"Total:"<<a<<"+"<<b<<"="<<a+b<<std::endl;
			std::cout<<"Calculate again?(y/n)";
			std::cin>>key;
		} catch (std::exception e) {
			std::cout<<e.what()<<std::endl;
			std::cout<<"Please type decimals again!"<<std::endl;
		}
	}
}
0
0
分享到:
评论

相关推荐

    大整数相加

    C++ 大整数相加代码 C++ 大整数相加代码 C++ 大整数相加代码

    数据结构C++长整数相加

    本项目名为“数据结构C++长整数相加”,它使用C++语言实现了长整数的相加功能,这是一种常见但又具有挑战性的任务,尤其是在处理大数运算时。下面我们将深入探讨这个主题涉及的知识点。 1. **C++语言基础**:C++是...

    C++大整数运算

    在C++编程语言中,处理大整数是一项挑战,因为标准库提供的`int`, `long`, 或 `long long`类型在处理超过一定范围的数值时可能会溢出。为了解决这个问题,开发者通常需要自定义大整数类来实现大整数的运算。本文将...

    无限大整数相加减

    本程序的功能是实现无限大的2个整数相加或者相减,供编程初学者参考

    C++语言实现长整数相加减

    C++语言实现长整数相加减 C++语言实现长整数相加减是一种常见的编程技术,旨在解决多位整数加减的计算问题。本程序使用C++语言实现长整数相加减的计算,包括负数计算。下面是该程序的详细解释: 首先,main函数是...

    C++大整数运算代码

    在C++编程语言中,处理大整数运算是一项挑战,因为标准库提供的`int`、`long`或`long long`等数据类型都有其存储和计算的限制。当需要进行超出这些类型范围的大整数运算时,我们通常需要自定义数据结构和算法。标题...

    C++大整数类

    在C++中,由于标准库并没有内置大整数类,因此在处理大整数时,通常需要自定义一个类来实现。本示例中的"C++大整数类"就是这样一个类,用于存储和操作任意位数的整数。这里我们将深入讨论大整数类的设计、实现以及...

    两无限长整数相加的C++源代码

    总结来说,"两无限长整数相加"的C++实现涉及到的主要知识点包括:动态数组的使用、大整数表示、位级别的加法运算、进位处理以及面向对象编程中的类设计和运算符重载。理解和掌握这些概念对于提升C++编程能力,尤其是...

    大整数C++ 类 源代码

    大整数加法通常涉及位操作和进位,确保两个大整数相加后得到正确的结果。 6. `mull.cpp`:这可能是大整数乘法的另一种实现,或者是某个特定算法的实现,比如快速乘法或者平方运算。 7. `bigint.h`:这是一个头文件...

    C++编写大整数加减法,乘法

    遍历两个大整数的每一位,进行逐位相加,并考虑进位。在C++中,可以使用两层循环实现: ```cpp void addBigInt(std::vector&lt;char&gt;& a, std::vector&lt;char&gt;& b) { int carry = 0; for (size_t i = 0; i () || i ();...

    C++实现的大整数四则运算

    C++作为一门强类型且高效的语言,虽然标准库中并没有内置大整数支持,但可以通过自定义数据结构和算法来实现。这个项目就是基于这样的背景,作者尝试实现了大整数的四则运算。 首先,我们来看大整数类的设计。在C++...

    大整数相加,计算两个非负整数的和,可以精确计算2的100次方

    在计算机科学中,大整数相加是一项关键的计算任务,特别是在处理大量数据或执行高精度数学运算时。由于标准整数类型(如int、long)在面对超过其位宽限制的数值时会溢出,因此需要特殊的数据结构和算法来处理大整数...

    C++大数相加减

    C++标准库并未提供内置的大数支持,因此要实现大数相加减的功能,通常需要自定义数据结构和算法。这个项目"BigNumberAdd"显然是关于如何用C++来实现大数加法和减法的示例。 首先,我们要创建一个表示大数的数据结构...

    c++任意长度两位整数相加求值

    c++任意长度两位整数相加求值 通过截取数组获取

    c++实现大数相加

    大数相加是指将两个或多个大整数相加,得到一个新的大整数。这里的“大整数”是指超出C++标准整数类型范围的整数。 C++中的大数实现 在C++中,我们可以使用字符串来表示大整数,因为字符串可以存储任意长度的数字...

    C++ 分数与整数的混合运算 操作符重载

    1. **+**(加法):这需要两个版本,一个是分数与分数相加,另一个是分数与整数相加。 2. **-**(减法):同样需要两个版本,分数减分数和分数减整数。 3. *****(乘法):分数乘分数和分数乘整数。 4. **/**(除...

    C++写的大整数计算器

    大整数的加法和减法可以通过类似于小学数学的方法实现,逐位相加或相减,并考虑进位和借位。 乘法和除法则更为复杂。乘法可以使用Karatsuba算法或更高效的Toom-Cook多项式分解方法,这些算法将大整数乘法转化为较小...

    大整数 C++课程设计

    对于两个大整数的加法,我们可以从低位到高位逐位相加,同时考虑进位。如果某位超过了其最大值(例如,对于32位整数,超过4294967295),则需要将进位传递到下一位。减法与此类似,只是还需要处理借位的情况。 三、...

    c++模板实现多项式相加

    本话题将详细讲解如何利用C++模板实现链表表示的多项式相加。 首先,我们需要了解多项式的基本概念。一个多项式是由常数、变量及其指数组合而成的数学表达式,例如2x^3 + 5x^2 - 3x + 7。在C++中,我们可以使用链表...

    自已写的大整数相乘C++代码

    自己写的大整数相乘算法,算法里包含有大整数相加算法。

Global site tag (gtag.js) - Google Analytics