POJ 1001 Exponentiation 无限大数的指数乘法 题解

来源:互联网 发布:php 跳出while循环 编辑:程序博客网 时间:2024/05/18 01:40

POJ做的很好,本题就是要求一个无限位大的指数乘法结果。

要求基础:无限大数位相乘

额外要求:处理特殊情况的能力 -- 关键是考这个能力了。

所以本题的用例特别重要,再聪明的人也会疏忽某些用例的。

本题对程序健壮性的考查到达了变态级别了。

某人贴出的测试用例数据地址: http://poj.org/showmessage?message_id=76017

有了这些用例,几下调试就过了。

我关键漏了的用例:

000.10  1
000000  1
000.00  1
.00000  0
000010  1

#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的时候,要输出0bool 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,哈哈.


3 0
原创粉丝点击