好久没有用过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;
}
}
}
分享到:
相关推荐
C++ 大整数相加代码 C++ 大整数相加代码 C++ 大整数相加代码
本项目名为“数据结构C++长整数相加”,它使用C++语言实现了长整数的相加功能,这是一种常见但又具有挑战性的任务,尤其是在处理大数运算时。下面我们将深入探讨这个主题涉及的知识点。 1. **C++语言基础**:C++是...
在C++编程语言中,处理大整数是一项挑战,因为标准库提供的`int`, `long`, 或 `long long`类型在处理超过一定范围的数值时可能会溢出。为了解决这个问题,开发者通常需要自定义大整数类来实现大整数的运算。本文将...
本程序的功能是实现无限大的2个整数相加或者相减,供编程初学者参考
C++语言实现长整数相加减 C++语言实现长整数相加减是一种常见的编程技术,旨在解决多位整数加减的计算问题。本程序使用C++语言实现长整数相加减的计算,包括负数计算。下面是该程序的详细解释: 首先,main函数是...
在C++编程语言中,处理大整数运算是一项挑战,因为标准库提供的`int`、`long`或`long long`等数据类型都有其存储和计算的限制。当需要进行超出这些类型范围的大整数运算时,我们通常需要自定义数据结构和算法。标题...
在C++中,由于标准库并没有内置大整数类,因此在处理大整数时,通常需要自定义一个类来实现。本示例中的"C++大整数类"就是这样一个类,用于存储和操作任意位数的整数。这里我们将深入讨论大整数类的设计、实现以及...
总结来说,"两无限长整数相加"的C++实现涉及到的主要知识点包括:动态数组的使用、大整数表示、位级别的加法运算、进位处理以及面向对象编程中的类设计和运算符重载。理解和掌握这些概念对于提升C++编程能力,尤其是...
大整数加法通常涉及位操作和进位,确保两个大整数相加后得到正确的结果。 6. `mull.cpp`:这可能是大整数乘法的另一种实现,或者是某个特定算法的实现,比如快速乘法或者平方运算。 7. `bigint.h`:这是一个头文件...
遍历两个大整数的每一位,进行逐位相加,并考虑进位。在C++中,可以使用两层循环实现: ```cpp void addBigInt(std::vector<char>& a, std::vector<char>& b) { int carry = 0; for (size_t i = 0; i () || i ();...
C++作为一门强类型且高效的语言,虽然标准库中并没有内置大整数支持,但可以通过自定义数据结构和算法来实现。这个项目就是基于这样的背景,作者尝试实现了大整数的四则运算。 首先,我们来看大整数类的设计。在C++...
在计算机科学中,大整数相加是一项关键的计算任务,特别是在处理大量数据或执行高精度数学运算时。由于标准整数类型(如int、long)在面对超过其位宽限制的数值时会溢出,因此需要特殊的数据结构和算法来处理大整数...
C++标准库并未提供内置的大数支持,因此要实现大数相加减的功能,通常需要自定义数据结构和算法。这个项目"BigNumberAdd"显然是关于如何用C++来实现大数加法和减法的示例。 首先,我们要创建一个表示大数的数据结构...
c++任意长度两位整数相加求值 通过截取数组获取
大数相加是指将两个或多个大整数相加,得到一个新的大整数。这里的“大整数”是指超出C++标准整数类型范围的整数。 C++中的大数实现 在C++中,我们可以使用字符串来表示大整数,因为字符串可以存储任意长度的数字...
1. **+**(加法):这需要两个版本,一个是分数与分数相加,另一个是分数与整数相加。 2. **-**(减法):同样需要两个版本,分数减分数和分数减整数。 3. *****(乘法):分数乘分数和分数乘整数。 4. **/**(除...
大整数的加法和减法可以通过类似于小学数学的方法实现,逐位相加或相减,并考虑进位和借位。 乘法和除法则更为复杂。乘法可以使用Karatsuba算法或更高效的Toom-Cook多项式分解方法,这些算法将大整数乘法转化为较小...
对于两个大整数的加法,我们可以从低位到高位逐位相加,同时考虑进位。如果某位超过了其最大值(例如,对于32位整数,超过4294967295),则需要将进位传递到下一位。减法与此类似,只是还需要处理借位的情况。 三、...
本话题将详细讲解如何利用C++模板实现链表表示的多项式相加。 首先,我们需要了解多项式的基本概念。一个多项式是由常数、变量及其指数组合而成的数学表达式,例如2x^3 + 5x^2 - 3x + 7。在C++中,我们可以使用链表...
自己写的大整数相乘算法,算法里包含有大整数相加算法。