大整数C++类的实现

来源:互联网 发布:剑灵灵族男捏脸数据吧 编辑:程序博客网 时间:2024/06/06 10:01
#include<iostream>#include<vector>#include<string>#include<assert.h>using namespace std;class BigInt{public:// 操作符重载:1. 参数数目。2. 什么操作符重载应该设为成员函数。friend ostream& operator << (ostream& out,BigInt& bint);BigInt();BigInt(unsigned long);BigInt(BigInt&bint);BigInt(string bint);BigInt(vector<unsigned short>);string str();BigInt operator+( BigInt &bint);BigInt operator*( BigInt &bint);vector<unsigned short> vec();unsigned short& operator[](int i);BigInt operator =(BigInt &bint);private:vector<unsigned short> m_bint;};ostream& operator << (ostream& out,BigInt& bint){out << bint.str();return out;}//该函数得作用是将向量中的每一个数字转化为字符//数字+'0'就相当于将数字转化为字符string BigInt::str(){string result="";for(int i = m_bint.size()-1;i >= 0; i--){result += (m_bint[i]+'0');}return result;}BigInt::BigInt(){}unsigned short& BigInt::operator[](int i){assert(i>=0 && i<m_bint.size());   return m_bint[i];}//将一个长整型转化为向量的结构,长整型中的每一位//都放入向量的每一个单位中。//先存低位数字,再存高位数字。BigInt::BigInt(unsigned long bint){unsigned long tempint;while(bint){tempint = bint%10;m_bint.push_back(tempint);bint = bint/10;}}//复制构造函数BigInt::BigInt(BigInt& bint){m_bint = bint.vec();}//将字符串中的每一个字符转化为数字存放进向量中//从字符串的尾端开始存放,和数字转化为字符串的顺序//保持一致。BigInt::BigInt(string str){for(int i = str.size()-1;i >= 0; i--){m_bint.push_back(str[i]-'0');}}BigInt::BigInt(vector<unsigned short> bint){m_bint = bint;}vector<unsigned short> BigInt::vec(){return m_bint;}// 赋值操作符重载应该返回对同一类类型的引用BigInt& BigInt::operator =(BigInt& bint){m_bint = bint.m_bint;return *this;}BigInt BigInt::operator +(BigInt& bint){unsigned short carry = 0;unsigned short partResult=0;vector<unsigned short> vecResult;int i ;for(i = 0 ;i < m_bint.size()&& i < bint.m_bint.size();i++){partResult = carry + m_bint[i]+ bint[i];//carry 加法进位carry = partResult/10;partResult = partResult%10;vecResult.push_back(partResult);}if(carry ==1&& i == m_bint.size()&& i == bint.m_bint.size()){vecResult.push_back(carry);    }else{while(i < m_bint.size()){partResult = carry + m_bint[i++];carry = partResult/10;partResult = partResult%10;vecResult.push_back(partResult);}while(i < bint.m_bint.size()){ partResult = carry + bint[i++];carry = partResult/10;partResult = partResult%10;vecResult.push_back(partResult);}}BigInt Result(vecResult);return Result;}BigInt BigInt::operator *( BigInt& bint){unsigned short partResult;unsigned int length = m_bint.size()+bint.m_bint.size()-1;vector<unsigned short> multResult(length,0);for(int i = 0; i < m_bint.size();i++){for(int j = 0; j < bint.m_bint.size();j++){partResult = multResult[i+j] + m_bint[i]*bint[j];if(partResult > 9){if(i+j+1 < length){multResult[i+j+1] = partResult / 10;partResult = partResult % 10;}else{multResult.push_back(partResult/10);partResult = partResult % 10;}}multResult[i+j] = partResult;}}BigInt result(multResult);return result;}int main(){string a = "123424324242";string b = "10234241411414259984482380000";BigInt A(a);BigInt B(b);BigInt C= A+B;BigInt D=A*B;cout<<"A+B = " << C << endl;cout<<"A*B = " << D << endl;system("pause");return 0;}

0 0
原创粉丝点击