pku_Exponentiation_1001

原创 2007年09月25日 08:57:00
/*
  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;
}
 

POJ 1001Exponentiation解题报告——求高精度幂——【PKU ACM】

这道题目的整体思想,就是将float型数据,转化成整数,将计算float型幂次方,转变成求整数的幂次方。 然后利用数组来存储乘积的每一位。 核心代码就是那一段高精度求幂的代码,希望大家能够自己仔细...
  • piano7heart
  • piano7heart
  • 2011年05月13日 18:33
  • 783

PKU_1001_Exponentiation

Exponentiation Description Problems involving the computation of exact values of very large ...
  • c07331427
  • c07331427
  • 2013年03月22日 22:39
  • 335

POJ 1001 Exponentiation 求高精度幂 C源代码

  • 2013年11月17日 22:33
  • 6KB
  • 下载

POJ 1001Exponentiation解题报告——求高精度幂

http://poj.org/problem?id=1001/* DescriptionProblems involving the computation of exact values of ve...
  • wangdeqiang2007
  • wangdeqiang2007
  • 2017年12月31日 23:14
  • 31

高精度浮点数幂次方 POJ 1001 Exponentiation

题目是在POJ上的第1001道 Exponentiation Description Problems involving the computation of exact values ...
  • MysticalRzc
  • MysticalRzc
  • 2017年02月09日 23:12
  • 160

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的很好,本题就是要求一个无限位大的指数乘法结果。 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了。 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的。 本...
  • kenden23
  • kenden23
  • 2014年04月18日 10:20
  • 4610

POJ1001 Exponentiation--浮点数的高精度乘法

Exponentiation
  • sin_XF
  • sin_XF
  • 2014年08月01日 19:56
  • 378

【POJ】 1001-Exponentiation 【高精度乘法】

题目: Exponentiation Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 139077   Acce...
  • xianyun2009
  • xianyun2009
  • 2014年12月03日 00:13
  • 795

POJ 1001 "Exponentiation"

#include #include  #define MAX 300 int intLen(int *pArr){ int len = 0; while(pArr[len] != -1) { len...
  • mykoma521
  • mykoma521
  • 2011年06月16日 15:24
  • 386

POJ1001 Exponentiation (解题报告)

POJ1001 Exponentiation (解题报告)        原文: Exponentiation Time Limit: 500MS   M...
  • gongfudi50
  • gongfudi50
  • 2012年03月24日 22:47
  • 350
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pku_Exponentiation_1001
举报原因:
原因补充:

(最多只允许输入30个字)