#include<iostream> #include<string.h> #include<math.h> using namespace std ; #define MAX_LENGTH 100 //数组长度 #define MAX_VALUE 1000 //每个int表示的不可达上界 #define MAX_SYS 3 //MAX_VALUE = pow(10,MAX_SYS) class BigInteger { public: BigInteger(char s[] , int size) : index(0) { for(int y = 0 ;y<MAX_LENGTH ; y++) num[y] = 0 ; int j = 0 ; for(int i = size -1 ; i>= 0 ;i--) { if(s[i]=='.') continue ; if(j != MAX_SYS) num[index] += (s[i] - '0')*pow(10,j); else { num[++index] += s[i] - '0' ; j = 0 ; } ++j ; } } BigInteger() : index(0) { for(int y = 0 ;y<MAX_LENGTH ; y++) num[y] = 0 ; } BigInteger(int i ) : index(0) { for(int y = 0 ;y<MAX_LENGTH ; y++) num[y] = 0 ; num[0] = i ; } friend BigInteger operator+(const BigInteger &B1 ,const BigInteger &B2) { int i = 0 ; BigInteger p ; int valuePlus = 0 ; int value = 0 ; int addition = 0 ; int max_index = B1.getIndex() > B2.getIndex() ? B1.getIndex() :B2.getIndex() ; while(i<=max_index) { valuePlus = B1.getValue(i)+B2.getValue(i) + addition; value = valuePlus%MAX_VALUE ; p.setValue(i,value); if(value != valuePlus) addition = 1 ; else addition = 0 ; ++i ; } if(addition != 0) p.setValue(i,addition); return p ; } friend BigInteger operator*(const BigInteger &B1 , const BigInteger &B2) { int i = B1.getIndex(); int j = B2.getIndex(); BigInteger Bs ; BigInteger Btemp ; int addition = 0 ; int valueMulti = 0 ; int value = 0 ; int is , js ; for( is = 0 ; is <= i ; ++is) { for( js = 0 ; js<= j ; ++js) { valueMulti = B2.getValue(js)*B1.getValue(is) + addition ; value = valueMulti%MAX_VALUE ; addition = (int)(valueMulti/MAX_VALUE) ; Btemp.setValue(js+is,value) ; } if(addition!=0) { Btemp.setValue(js+is,addition); addition = 0 ; } Bs = Bs+Btemp ; Btemp.clear(); } return Bs ; } void setValue(int ind , int value) { if(ind>index) index = ind ; num[ind] = value ; } int getValue(int index)const { return num[index] ; } int getIndex()const { return index ; } void print() { int g = MAX_SYS ; int j = 0 ; for(j = index ; j>= 0 ; j--) { g = MAX_SYS ; while( num[j] < pow(10,g-1) && g>1 && j!=index) { cout<<"0"; g--; } cout<<num[j]; } cout<<endl; } void clear() { while(index>=0) num[index--] = 0 ; } void print(int pos) { int countIndex = pos/MAX_SYS ; int oneOfThree = pos%MAX_SYS ; int i = 0 ; int j = 0 ; int g = MAX_SYS ; int max_cin = countIndex > index ? countIndex:index ; if(countIndex > index) cout<<"." ; if(oneOfThree == 0) { for(j = max_cin;j>=countIndex;j--) { g = MAX_SYS ; while( num[j] < pow(10,g-1) && g>1 && j!=max_cin) { cout<<"0"; g--; } cout<<num[j]; } if(countIndex <= index) cout<<"."; while(j>=0) { g = MAX_SYS ; while( num[j] < pow(10,g-1) && g>1 ) { cout<<"0"; g--; } cout<<num[j]; j-- ; } } else { for(j = max_cin; j>countIndex; j--) { g = MAX_SYS ; while( num[j] < pow(10,g-1) && g>1 && j!=max_cin ) { cout<<"0"; g--; } cout<<num[j] ; } if(countIndex<=index) { int k = oneOfThree -1 ; cout<<(int)(num[j]/(int)pow(10,oneOfThree)); cout<<"."; while(k >= 0) { cout<<(int)(num[j]/pow(10,k)); k--; } } if(countIndex > index) { int k = oneOfThree ; while(k-- > 0) { cout<<"0"; } } j--; while(j>=0) { g = MAX_SYS ; while( num[j] < pow(10,g-1) && g>1) { cout<<"0"; g--; } cout<<num[j]; j-- ; } } cout<<endl ; } private: int num[MAX_LENGTH] ; int index ; }; int foo(char c[] , int size_C , int cn ) { int i = 0 ; for( i = size_C - 1 ; i>=0 ; --i) { if(c[i]=='0') { c[i] = '\0' ; } else break ; } int np = 0 ; for( i = strlen(c)-1 ; i>=0; --i) { if(c[i] != '.') ++np ; else break ; } return np*cn ; } int main(int argc , char *args[]) { char s[10] ; int n; int i = 0 ; int Dpoint ; while(cin>>s>>n) { Dpoint = foo(s,strlen(s),n) ; BigInteger Bs(s,strlen(s)) ; BigInteger Bn(1) ; for(i=0 ; i<n ; ++i) { Bn = Bn*Bs ; } if(Dpoint!=0) Bn.print(Dpoint); else Bn.print() ; } return 0 ; }
转载请注明原文地址: https://www.6miu.com/read-50757.html