POJ做的很好,本題就是要求一個無限位大的指數乘法結果。 要求基礎:無限大數位相乘 額外要求:處理特殊情況的能力 -- 關鍵是考這個能力了。 所以本題的用例特別重要,再聰明的人也會疏忽某些用例的。 本題對程序健壯性的考查到達了變態級別了。 某人貼出的測試用例數據地址: http://poj.org/showmessage?message_id=76017 有了這些用例,幾下調試就過了。 我關鍵漏了的用例: 000.10 1 000000 1 000.00 1 .00000 0 000010 1 [cpp] #include <stdio.h> #include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; bool standardizeNumNoDot(string &s) { while (!s.empty() && '0' == s[0]) s.erase(s.begin()); if (s.empty()) s = "0";//防止n==1的時候,要輸出0 bool notDot = true; for (unsigned i = 0; i < s.size() && notDot; i++) { if ('.' == s[i]) notDot = false; } if (notDot) return true; while (!s.empty() && '0' == s[s.size()-1]) s.erase(s.end()-1); if (!s.empty() && '.' == s[s.size()-1]) s.erase(s.end()-1); if ( s.empty() ) s = "0"; return false; } int handleDecimalPoint(string &s) { if (standardizeNumNoDot(s)) return 0; int fraction = 0; int j = 0; for (unsigned i = 0; i < s.size() ; i++) { if (fraction > 0) fraction++; if (s[i] != '.') s[j++] = s[i]; else fraction++; } s.erase(s.end()-1); return fraction - 1; } string mulStr(string a, string b) { if ("0" == a || "0" == b) return "0"; int ap = handleDecimalPoint(a); int bp = handleDecimalPoint(b); string ans(a.size()+b.size(), '0'); for (int i = a.size() - 1; i >= 0 ; i--) { int carry = 0; int an = a[i] - '0'; for (int j = b.size() - 1; j >= 0 ; j--) { int bn = b[j] - '0'; int sum = an * bn + carry + ans[i+j+1] - '0'; carry = sum / 10; ans[i+j+1] = sum % 10 + '0'; } if (carry) ans[i] += carry; } if (ap > 0 || bp > 0) ans.insert(ans.end() - ap - bp, '.'); standardizeNumNoDot(ans); return ans; } string sPow(string s, int n) { if (s.empty() || "0" == s) return "0";//為了程序的健壯性,一定要加上 if (0 == n) return "1"; if (1 == n) return s; string divideStr = sPow(s, n/2); divideStr = mulStr(divideStr, divideStr); if (n % 2) divideStr = mulStr(divideStr, s); return divideStr; } void Exponentiation() { string s; int n; while(cin>>s>>n) { standardizeNumNoDot(s);//當n==1的時候 cout<<sPow(s, n)<<endl; } } int main() { Exponentiation(); return 0; } 本算法用時0MS,哈哈.