POJ1001#高精度浮点数幂运算

来源:互联网 发布:手机系统恢复软件 编辑:程序博客网 时间:2024/05/17 06:01

原本想写个BigInt类来做这道题的,然后百度了一圈发现很多人说这道题多坑,慎点。

于是就直接写了,还是参照了别人的代码写好的。

其实大多数时间花在了选择什么数据结构这种鸡毛蒜皮的事情上,大数乘法应该是不难的,核心代码也就两行,其他都是各种处理。

#include <iostream>#include <string>using namespace std;int main(){string s;int pow;int a[99999], b[6], res[99999];int lengthA, lengthB, lengthR;int dot = -1;int front, back;while (cin>>s>>pow){for (int i = s.length() - 1, j = 1; i >= 0; --i){if (s[i] != '.'){a[j] = b[j++] = s[i] - '0';//逆序存储}else{dot = i;//小数点在顺数的第i位}}if (dot == -1){lengthA = lengthB = 6;}else{lengthA = lengthB = 5;}//幂运算for (int k = 1; k < pow; ++k){for (int i = 0; i < 99999; ++i){res[i] = 0;}for (int i = 1; i <= lengthA; ++i){for (int j = 1; j <= lengthB; ++j){res[i + j - 1] += a[i] * b[j];if (res[i + j - 1] > 9){res[i + j] += res[i + j - 1] / 10;res[i + j - 1] %= 10;}}}if (res[lengthA + lengthB - 1] > 9){res[lengthA + lengthB] += res[lengthA + lengthB - 1] / 10;res[lengthA + lengthB - 1] %= 10;}//将和赋值给alengthA = lengthA + lengthB;for (int i = 1; i <= lengthA; ++i){a[i] = res[i];}}//计算小数点的位置if (dot == -1){for (int i = lengthA; i >= 1; --i){cout << res[i];}cout << endl;}else{dot = 5 - dot;dot *= pow;//过滤掉前面和后面的0for (int i = lengthA; i >= 1; --i){if (a[i] != 0){front = i;break;}}for (int i = 1; i <= lengthA; ++i){if (a[i] != 0){back = i;break;}}//front和back之间的是除去前后的0的数字//下面判断小数点的位置if (dot > front){front = dot;//如果小数点在front之前,说明结果的整数部分为零,这个时候要将front定位到小数点处}if (dot < back){back = dot + 1;//如果小数点在back之后,说明小数点之后全为0,这个时候要将back定位到小数点的前一位}while (front >= back){if (front == dot){cout << ".";}cout << a[front--];}cout << endl;}}}


0 0
原创粉丝点击