//POJ 1001 Exponentiation (百炼叫test)高精浮点乘方 //by 澄哥 #include <iostream> #include <cstring> #define MAX 200 using namespace std; char* cut_zero(char *res) { int headZero; int len = strlen(res); for (headZero = 0; headZero < len-1; headZero++) if (res[headZero]!='0') break; if(headZero) for (int i = 0; i <= len; i++) res[i] = res[i+headZero]; return res; } char *big_mutiply(char a[], char b[]) { int la = strlen(a); int lb = strlen(b); int r[MAX] = {0}; char* res = new char [MAX]; int head = 0; for (int i = 0; i < la; i++) for (int j = 0; j < lb; j++) r[i+j] += (a[i]-'0')*(b[j]-'0'); for (int i = la + lb - 2; i >= 0; i--) { if (i == 0) { head = r[0]/10; r[0] = r[0]%10; } else { r[i-1] += r[i]/10; r[i] = r[i]%10; } } if (head == 0) { for (int i = 0; i < la + lb -1; i++) res[i] = r[i]+'0'; res[la + lb - 1] = '\0'; } else { for (int i = la + lb - 2; i >= 0; i--) res[i+1] = r[i]+'0'; res[0] = head + '0'; res[la + lb] = '\0'; } return cut_zero(res); } char *big_pow(char a[], int n) { if (n == 0) return "1"; if (n == 1) return cut_zero(a); if (n % 2 == 0) return big_mutiply(big_pow(a, n/2),big_pow(a, n/2)); else return big_mutiply(big_pow(a, n/2),big_pow(a, n/2+1)); } char* double_pow(char s[], int n) { int dot = 0; char* s2 = new char[MAX]; int len = strlen(s); for (int i = 0, j = 0; i <= len; i++) { if (s[i] == '.') dot = (len-i-1)*n; else s2[j++] = s[i]; } strcpy(s2, big_pow(s2, n)); if (dot == 0) return s2; len = strlen(s2); if (len >= dot) { for (int i = len; i >= len - dot; i--) s2[i+1] = s2[i]; s2[len-dot] = '.'; } else { for (int i = len; i>= 0; i--) s2[i+dot-len+1] = s2[i]; for (int i = 1; i <= dot - len; i++) s2[i] = '0'; s2[0] = '.'; } for (int i = strlen(s2)-1; i >= 0; i--) { if (s2[i] == '0') { s2[i] = '\0'; } else { if (s2[i] == '.') s2[i] = '\0'; break; } } return s2; } int main() { char s[10]; int n; while(cin >> s >> n) { cout << double_pow(s, n) << endl; } // system("pause"); return 0; }
转载于:https://www.cnblogs.com/stdio/archive/2012/05/24/2516552.html