大数相乘的问题

ExpandedBlockStart.gif 代码
/*
 * MaxNumMulti.h
 *
 *  Created on: 2010-4-2
 *      Author: root
 
*/

#ifndef MAXNUMMULTI_H_
#define  MAXNUMMULTI_H_
#include
< string >
#include 
< stdlib.h >
#include 
< sstream >
#include 
< iostream >
using   namespace  std;


class  MaxNumMulti {
public :
    MaxNumMulti(
string  a, string  b);
    
string  getMultiResult();
    
virtual   ~ MaxNumMulti();
private :
    
string  maxNumA;
    
string  maxNumB;
    
int   *  linkA;
    
int  lenA;
    
int   *  linkB;
    
int  lenB;
    
int   *  linkC;
    
void  constructLink();
    
void  multi();

};

#endif  /* MAXNUMMULTI_H_ */
ExpandedBlockStart.gif 代码
/*
 * MaxNumMulti.cpp
 *
 *  Created on: 2010-4-2
 *      Author: root
 
*/

#include 
" MaxNumMulti.h "

MaxNumMulti::MaxNumMulti(
string  a,  string  b) {
    
//  TODO Auto-generated constructor stub
    maxNumA  =  a;
    maxNumB 
=  b;

}

MaxNumMulti::
~ MaxNumMulti() {
    
//  TODO Auto-generated destructor stub
    delete[] linkA;
    delete[] linkB;
    delete[] linkC;
}
void  MaxNumMulti::constructLink() {
    lenA 
=  maxNumA.length();
    lenB 
=  maxNumB.length();
    linkA 
=   new   int [lenA];
    linkB 
=   new   int [lenB];
    linkC 
=   new   int [lenA  +  lenB];
    
int  i  =   0 ;
    
for  (; i  <  lenA  &&  i  <  lenB; i ++ ) {
        linkA[i] 
=  maxNumA[lenA  -   1   -  i]  -   ' 0 ' ;
        linkB[i] 
=  maxNumB[lenB  -   1   -  i]  -   ' 0 ' ;
    }
    
if  (i  ==  lenA) {
        
for  (; i  <  lenB; i ++ ) {
            linkB[i] 
=  maxNumB[lenB  -   1   -  i]  -   ' 0 ' ;
        }
    } 
else  {
        
for  (; i  <  lenA; i ++ ) {
            linkA[i] 
=  maxNumA[lenA  -   1   -  i]  -   ' 0 ' ;
        }
    }
    
for  (i  =   0 ; i  <  lenA  +  lenB; i ++ ) {
        linkC[i] 
=   0 ;
    }
}
void  MaxNumMulti::multi() {
    
int  append  =   0 ;
    
int  indexC  =   0 ;
    
for  ( int  i  =   0 ; i  <  lenA; i ++ ) {
        
int  bufC  =  indexC;
        
for  ( int  j  =   0 ; j  <  lenB; j ++ ) {
            
int  buf  =  linkA[i]  *  linkB[j]  +  append  +  linkC[bufC];
            
int  res  =  buf  %   10 ;
            
int  div  =  buf  /   10 ;
            linkC[bufC
++ =  res;
            append 
=  div;
        }
        linkC[bufC] 
=  append;
        append 
=   0 ;
        indexC
++ ;
    }

}

string  MaxNumMulti::getMultiResult() {
    constructLink();
    multi();
    
int  lenC  =  lenA + lenB;
    
if (linkC[lenC - 1 ] == 0 )
        lenC 
-= 1 ;
    
string  str  =   "" ;
    
for  ( int  i  =  lenC - 1 ; i  >= 0 ; i -- ) {
         stringstream   tmp;
         tmp
<< linkC[i];
         str 
=  str + string (tmp.str());
    }
    
// cout<<str<<endl;
     return  str;

}


转载于:https://www.cnblogs.com/zhuxiongfeng/archive/2010/04/02/1703371.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值