您的位置:首页 > 编程语言 > C语言/C++

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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: