当初改的时候思路比较乱,代码很丑,勿喷
#include "iostream" #include "cstring" #include "string" #define LEN_MAX 135 using namespace std; int FindPoint(string &Num) { for(size_t ix = 0 ; true ; ix ++ ) { if( Num[ix] == '.') { return (int)ix; } } } void FindZero(string &Num) { Num.erase(FindPoint(Num),1); for( size_t ix = 0 ; Num[ix] == '0'; ) { Num.erase((int)ix,1); } } void ClZero(string &Num) { for(size_t ix = Num.size() - 1 ; ix != -1 && Num[ix] == '0'; ix -- ) { Num.erase((int)ix,1); } } void Multiplication( string &Long , string &Short , char * Aw , int * Container ) { short TLength = (short)Short.size()+ (short)Long.size(); Aw[0] = '\0'; for(short i = 0 ; i < TLength - 1 ; i ++ ) { Container[i] = 0; } for(short ix = 0 ; ix != Short.size() ; ix ++ ) { for(short i = 0 ; i != Long.size() ; i ++ ) { Container[i + ix] += (Short[ix] - '0') * (Long[i] - '0'); } } for(short ix = TLength - 2 ; ix != 0 ; ix -- ) { Container[ix - 1] += Container[ix] / 10; Container[ix] = Container[ix] % 10; } for(short ix = 0 ; ix != TLength - 1 ; ix ++ ) { sprintf(Aw + strlen(Aw),"%ld",Container[ix]); } } int main(void) { string N,Num2; int ac[LEN_MAX]; int n; while(cin >> N >> n) { ClZero(N); short Ad = ( N.size() - FindPoint(N) - 1 )* n; FindZero(N); if(!N.empty()) { Num2 = N; for(size_t ix = 1 ; ix != n ; ix ++) { char Answer[LEN_MAX]; Multiplication(N,Num2,Answer,ac); N.assign(Answer); } if(Ad > 0) { if(Ad > N.size()) { cout << '.'; for(size_t i = 0 ; i < Ad - N.size() ; i ++ ) { cout << '0'; } } else { N.insert(N.size() - Ad,"."); } } cout << N << endl; } else { cout << "0" << endl; } } return 0; }