/**/ /* 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==0) return 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;}