程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1001 Exponentiation 無限大數的指數乘法 題解

POJ 1001 Exponentiation 無限大數的指數乘法 題解

編輯:C++入門知識

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,哈哈.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved