POJ1001 Exponentiation
2013-07-28 23:51
363 查看
题目来源:http://poj.org/problem?id=1001
题目大意:给出一个0.0至99.999 之间的实数R和一个1至25之间的整数,求Rn。
输入:一组R和n,每行的第1行至第6列为R,第8列至第9列为n。
输出:每行表示一个Rn的实际值。
Sample Input
Sample Output
解题关键:
1. 所求得的结果很可能超出了C/C++等语言标准类型的表达范围,所以需要以字符串来保存结果。
2. 显然可以将指数运算用连乘来实现。
3. 用倒序保存中间结果比较方便,可以避免进位时产生移位的操作。
View Code
题目大意:给出一个0.0至99.999 之间的实数R和一个1至25之间的整数,求Rn。
输入:一组R和n,每行的第1行至第6列为R,第8列至第9列为n。
输出:每行表示一个Rn的实际值。
Sample Input
95.123 12 0.4321 20 5.1234 15 6.7592 9 98.999 10 1.0100 12
Sample Output
548815620517731830194541.899025343415715973535967221869852721 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 43992025569.928573701266488041146654993318703707511666295476720493953024 29448126.764121021618164430206909037173276672 90429072743629540498.107596019456651774561044010001 1.126825030131969720661201
解题关键:
1. 所求得的结果很可能超出了C/C++等语言标准类型的表达范围,所以需要以字符串来保存结果。
2. 显然可以将指数运算用连乘来实现。
3. 用倒序保存中间结果比较方便,可以避免进位时产生移位的操作。
////////////////////////////////////////////////////////////////////////// // POJ1001 Exponentiation // Memory: 284K Time: 0MS // Language: C++ Result: Accepted ////////////////////////////////////////////////////////////////////////// #include <iostream> using namespace std; int result[130]; //保存结果 //将当前结果与底数相乘一次更新结果 void multiply(int multiplier) { //辅助数组 int temp[130]; for (int i = 0; i < 130; i++) { temp[i] = 0; } for (int i = 0; i < 125; i++) { int t = result[i] * multiplier; //第i位与乘数相乘 int carry = (t + temp[i]) / 10; //剩余数 temp[i] = (t + temp[i]) % 10; //计算第i位 //依次处理高位 int g = 1; while (carry) { int t = temp[i + g] + carry; carry = t / 10; temp[i + g] = t % 10; g++; } } for (int i = 0; i < 130; i++) { result[i] = temp[i]; } } //输出 void output(int sign) { int start = 0; int end = 129; //寻找不为0的最高位 for (int i = 0; i <= sign && i <= 129; i++) { start = i; if (result[i] != 0) { break; } } //寻找不为0的最低位 for (int i = 129; i >= 0; i--) { if (i == sign - 1) { end = i; break; } if (result[i] != 0) { end = i; break; } } //依序输出各位 for (int i = end; i >= start; i--) { if (i == sign - 1) { cout << '.'; } cout << result[i]; } cout << endl; } int main(void) { char c; while ((c = getchar()) != EOF) { int multiplier = 0; //记录底数(以整数形式记,不考虑小数点) int sign = 0; //记录小数点位置 int index = 4; //结果所有位初始化为0 for (int i = 0; i < 130; i++) { result[i] = 0; } //处理输入 for (int i = 1; i <= 5; i++) { if (c == '.') { //读入的位为小数点,记录小数点位数 sign = i; } else { //读入的位为数字,计算底数 multiplier = multiplier * 10 + (c - '0'); //倒序保存至初始结果 result[index--] = int(c - '0'); } c = getchar(); } //处理最后一位 if (c == '.') { sign = 6; } else { multiplier = multiplier * 10 + (c - '0'); result[index--] = int(c - '0'); } //计算小数点后位数 sign = 6 - sign; //n为指数 int n = 0; cin >> n; //连乘 for (int i = 1; i < n; i++) { multiply(multiplier); } //计算小数点位置 sign = sign * n; output(sign); getchar(); //去回车符 } system("pause"); return 0; }
View Code
相关文章推荐
- POJ 1001 Exponentiation (Java高精度)
- 【POJ】1001 Exponentiation
- poj 1001 Exponentiation
- Exponentiation - POJ 1001 高精度
- POJ 1001 Exponentiation
- POJ_1001 Exponentiation
- poj1001 Exponentiation
- poj 1001 Exponentiation
- POJ练习——1001 Exponentiation
- poj 1001 Exponentiation
- POJ 1001 Exponentiation
- POJ1001 Exponentiation解题报告
- POJ 1001 Exponentiation
- hdoj1063&&poj1001 Exponentiation(大数据的处理,浮点数的幂高精确度表示)
- POJ_1001_Exponentiation_高精
- POJ 1001: Exponentiation
- poj 1001 Exponentiation 高精度乘法
- POJ - 1001 Exponentiation(浮点数高精度乘法)
- POJ 1001 Exponentiation
- poj 1001 Exponentiation(高精度运算)