pku_Exponentiation_1001

/*
  Name: Exponentiation - PKU 1001
  Author: Mars
  Description: 高精度浮点数乘法
  Result: 2263098    bestzsx    1001    Accepted    296K    0MS    C++    4582B    2007-06-11 23:29:53
*/


#include 
< iostream >
#include 
< string >

#define  _MAXL 100
#define  _DSTEP 4
#define  _M 10000

using   namespace  std;

char   *  int2str( int  num, int  radix, char   * result);

class  BigNumber  {
    
public:
        
//const static int _MAXL;// = 100;
        
//const static int _DSTEP;// = 4;
        
//const static int _M;// = 10000; // 10^_DSTEP

        BigNumber();
        BigNumber(std::
string s);
        
static void standalize(string & s) {
            
// delete zeros like "0000000xxxx.xxxxx000000"
            int pos = s.find('.');
            
if (pos==-1) pos = s.length();
            
int i = 0;
            
while ((i<s.length())&&(i<pos)) {
                
if (s.at(i)!='0'break;
                
++i;
            }

            s.erase(
0,i);
            i 
= s.length()-1;
            
while((i>0)&&(i>pos)) {
                
if (s.at(i)!='0'break;
                
--i;
            }

            s.erase(i
+1,s.length()-i+1);
            
// Integer
            pos = s.find('.');
            
if ((pos!=-1)&&(pos==(s.length()-1))) {
                s.erase(pos,
1); // DELETE '.'
            }

        }

        
/* 'plus' only suitable to Integer Number
         * Haven't considered the Float Number
         
*/

        
static BigNumber * plus(BigNumber * A,BigNumber * B) {
            BigNumber 
* r = new BigNumber();
            
if (A->_bnLen > B->_bnLen) {
                BigNumber 
* t = A;
                A 
= B;
                B 
= t;
            }

/////Don't change i in the middle of each block/////
            int i,nc=0;
            
for (i=0;i<A->_bnLen;++i) {
                r
->_bn[i] = A->_bn[i]+B->_bn[i] + nc;
                nc 
= r->_bn[i] / _M;
                r
->_bn[i] = r->_bn[i] % _M;
            }

            
for (;i<B->_bnLen;++i) {
                r
->_bn[i] = B->_bn[i] + nc;
                nc 
= r->_bn[i] / _M;
                r
->_bn[i] = r->_bn[i] % _M;
            }

            
if (nc>0{
                r
->_bn[i] = nc;
                r
->_bnLen = i+1;
            }
 else {
                r
->_bnLen = i;
            }

/////
            return r;
        }

        
static BigNumber * multiple(BigNumber * A,BigNumber * B) {
            BigNumber 
* t;
            
if (A->_bnLen > B->_bnLen) {
                t 
= A;A = B;B = t;
            }

            BigNumber 
* r = new BigNumber();
            
int i,j,k,nc;
            
for (i=0;i<A->_bnLen;++i) {
                t 
= new BigNumber();
                nc 
= 0;
                
for (j=0;j<B->_bnLen;++j) {
                    t
->_bn[j+i] = B->_bn[j]*A->_bn[i] + nc;
                    nc 
= t->_bn[j+i] / _M;
                    t
->_bn[j+i] = t->_bn[j+i] % _M;
                }

                
if (nc>0{
                    t
->_bn[j+i] = nc;
                    t
->_bnLen = j+i+1;
                }
 else {
                    t
->_bnLen = j+i;
                }

//                t->Print();
                r = plus(r,t);
                delete t;
            }

            r
->_pointPos = A->_pointPos + B->_pointPos;
            
return r;
        }

        
void Print();
    
private:
        
int _bn[_MAXL];
        
int _bnLen;
        
int _pointPos;
}
;
BigNumber::BigNumber()
{
    memset(_bn,
0,sizeof(_bn));
    _bnLen
=0;
    _pointPos
=0;
}

BigNumber::BigNumber(std::
string  s)  {
    memset(_bn,
0,sizeof(_bn));
    _bnLen
=0;
    _pointPos
=0;
    
int i,j;
    
// STANDIZE
    standalize(s);
    
// delete _pointPos
    if (s.find('.')!=-1{
        _pointPos 
= s.length() - s.find('.'- 1;
        s.erase(s.find(
'.'),1); // DELETE '.'
    }

//    cout<<s<<" ";
    
// divide s & combine into _bn
    for (i=s.length()-1;i>=_DSTEP-1;i=i-_DSTEP) {
        
for (j=_DSTEP-1;j>=0;--j) {
            _bn[_bnLen]
=_bn[_bnLen]*10+s.at(i-j)-'0';
        }

        
++_bnLen;
    }

    
if (i>=0{
        
for (j=0;j<=i;++j) {
            _bn[_bnLen]
=_bn[_bnLen]*10+(s.at(j)-'0');
        }

        
++_bnLen;
    }

}

void  BigNumber::Print()  {
    
if (_bnLen==0{
        cout
<<"0 ";
        
return;
    }

    
int i,k,l;
    
string o="";
    
char tc[_DSTEP+1];
    memset(tc,
0,sizeof(tc));
    
// i = _bnLen-1
    int2str(_bn[_bnLen-1],10,tc);
//    cout<<"*"<<tc<<" ";
    o.append(tc);
    
// i < _bnLen-1
    tc[_DSTEP] = NULL;
    
for (i=_bnLen-2;i>=0;--i) {
        k 
= _bn[i];l=_DSTEP-1;
        
while (l>=0{
            tc[l] 
= k % 10 + '0';
            k 
= k / 10;
            
--l;
        }

//        cout<<tc<<" ";
        o.append(tc);
    }

    
if (_pointPos!=0{
        l 
= o.length() - _pointPos;
        
if (l>=0{
            o.insert(o.length()
-_pointPos,".");
        }
 else {
            
for (i=0;i<abs(l);++i) {
                o.insert(
0,"0");
            }

            o.insert(
0,"0.");
        }

    }

    standalize(o);
    cout
<<o<<" ";
}


int  main()  {
    
string s;
    
int n,i;
    
while (cin>>s>>n) {
        BigNumber 
* a = new BigNumber(s);
        BigNumber 
* r = new BigNumber("1");
        
if (n>=0{
            
for (i=0;i<n;++i) {
                r 
= BigNumber::multiple(r,a);
//                r->Print();
            }

        }

        r
->Print();
        delete r;
    }

    
return 0;
}


char   *  int2str( int  num, int  radix, char   * result)  {
    
if (num<0{
        num
=abs(num);
        int2str(num,radix,result);
        
return result;
    }

    
if (num%radix==0 && num/radix==0return result;
    result
=int2str(num/radix,radix,result);
    
if (num%radix>10
        
*result='A'+num%radix-10;
    
else 
        
*result='0'+num%radix;
    
*(result+1)=NULL;
    
return result+1;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值