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
- POJ 1001 Exponentiation 无限大数的指数乘法 题解
- POJ 1001 Exponentiation (高精度/大数乘法)
- POJ 1001 Exponentiation 大数乘法模拟
- POJ 1001 Exponentiation(大数)
- 【POJ】 1001 Exponentiation 大数
- POJ 1001 Exponentiation 高精度指数
- poj 1001 (Exponentiation) 高精度乘法
- 【POJ】 1001-Exponentiation 【高精度乘法】
- POJ 1001 Exponentiation 高精度乘法
- poj 1001 Exponentiation 高精度乘法
- poj 1001 Exponentiation(大数)
- poj 1001 Exponentiation JAVA大数
- 大数乘法 748 - Exponentiation
- poj 1001 Exponentiation(高精度乘法)
- POJ 1001 Exponentiation 大浮点数乘法
- POJ 1001Exponentiation(高精度浮点乘法)
- POJ 1001 Exponentiation(大树乘法)
- POJ 1001 Exponentiation(高精度乘法)
- 中文字体的英文名称对照表
- 有上下界网络流问题
- 最短路径—Dijkstra算法和Floyd算法
- 关于Dictionary元素的遍历
- ASP.NET DataTable合并
- POJ 1001 Exponentiation 无限大数的指数乘法 题解
- nyist -- 组队赛(一)
- 页面后台调用前台JS脚本
- JSON和java对象的互转
- [iPhone高级]基于XMPP的iOS聊天客户端程序(iOS端一)
- SringBuilder简介
- 业务中常用的sql语句
- Java 中>>和>>>的区别
- 用int数组初始化vector对象