C++长数的乘法
2014-03-03 21:31
309 查看
/************************************************************************/ /* 一般的,由于计算机的位数是确定的,从而也就决定能计算的最大数据,以及能 /* 表示的范围,并且计算很大的数据时,会导致计算速度非常慢,比如:你计算 /* 123456789*123345346那要计算好几秒的,也许计算机还可能无法计算,所以就使用 /* 下面的方法,也就是使用字符串的特性进行计算 /************************************************************************/ #include <iostream> #include <string> using namespace std; class LongNumberMult{ public: LongNumberMult(string number1,string number2); ~LongNumberMult(); void caculate(); void output_result(); private: void temp(); string m_number1; string m_number2; string m_result; int state; }; LongNumberMult::LongNumberMult(string number1,string number2){ //To Do initialize data this->m_number1=number1; this->m_number2=number2; this->m_result=""; this->state=0; } LongNumberMult::~LongNumberMult(){ //To Do release Resource } void LongNumberMult::temp(){ //To Do temp front and late int len=this->m_result.length(); string re; while (len >= 0) { re.append(1,this->m_result[--len]); } this->m_result=re; } void LongNumberMult::caculate(){ //To Do caculate int number1Lenght; int number2Lenght; int i,j; number1Lenght=this->m_number1.length(); number2Lenght=this->m_number2.length(); int b=0; int num=0; //under is caculate's core for (i=number2Lenght-1; i>=0; --i,num++) { b=0; if (this->m_number2[i]=='.') { this->state=1; return; } string temp; for (j=number1Lenght-1; j>=0; --j) { if (this->m_number1[j]=='.') { this->state=1; return; } int accu=0; accu=static_cast<int>((this->m_number2[i])-'0') * static_cast<int>((this->m_number1[j])-'0'); accu+=b; b=accu/10; temp.append(1,static_cast<char>(accu%10+'0')); } if (b!=0) { temp.append(1,static_cast<char>(b+'0')); b=0; } int j=num; int k=0; int tb=0; //under is add for (; j<this->m_result.length(); ++j,++k) { int cacu=static_cast<int>((this->m_result[j])-'0')+static_cast<int>((temp[k])-'0'); cacu+=tb; tb=cacu/10; this->m_result[j]=static_cast<char>(cacu%10+'0'); } if (k<=temp.length()-1) { for ( ;k<=temp.length()-1; ++k) { int cacu=static_cast<int>(temp[k]-'0'); cacu+=tb; tb=cacu/10; this->m_result.append(1,static_cast<char>(cacu%10+'0')); } if (tb!=0) { this->m_result.append(1,static_cast<char>(tb+'0')); tb=0; } } //下面是获得进位的数,也就是将进位的数存储起来 if (tb!=0) { this->m_result.append(1,static_cast<char>(tb+'0')); } } this->temp(); } void LongNumberMult::output_result(){ //To Do output result if (this->state==0) { cout<<this->m_number1<<"*"<<this->m_number2; cout<<"="<<this->m_result<<";"<<endl; } if (this->state==1) { cout<<"cann't caculate point number"<<endl; } } int main(int argc,char **argv) { cout<<"input number:"<<endl; string number1; string number2; cout<<"number1:"; cin>>number1; cout<<"number2:"; cin>>number2; LongNumberMult mult(number1,number2); mult.caculate(); mult.output_result(); return 0; } 运行结果如: input number: number1:12345678901234567890 number2:12345678901234567890 12345678901234567890*12345678901234567890=152415787532388367501905199875019052100;
相关文章推荐
- 第一次接触c语言
- C++中const详解
- C++类的继承
- c++ const限定符的使用
- C++中的long long和__int64类型
- 2012年蓝桥杯预选赛-微生物增殖(我有疑问)
- c++ string.split()使用
- nativeclient c++ ppapi opengles 初始化
- C语言屏幕打印,再删除打印的内容
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
- C++游戏笔记
- C语言经典算法100例-021-猴子吃桃问题
- C++ throw()引发的core
- How to Compile and Run C/C++ program on Ubuntu 11.10
- 自动专业12级C++程序设计
- c语言
- C语言输入中对scanf和gets的讨论
- 转换到 COFF 期间失败: 文件无效或损坏
- C++异常
- c++类的实例化,有没有new的区别