ACM篇:POJ1001Exponentiation总结

来源:互联网 发布:js中对象的长度 编辑:程序博客网 时间:2024/04/28 14:51

思路:

高精度浮点数乘法直接模拟。


保存小数部分长度,输出时判断。




作死处:


天真地以为样例误少了一个0,结果是故意的。



代码

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXL = 1024;const int L = 1024;int abs(int x){return (x >= 0) ? x : -x;}struct Bignum{int len;int lf;int a[MAXL];void clear(){len = lf = 0;memset(a, 0, sizeof(a));}void carry(){len <<= 1;for (int i = 0; i < len; i++){if (abs(a[i]) >= 10){a[i+1] += a[i] / 10;a[i] %= 10;}}while (abs(a[len]) >= 10){a[len+1] += a[len] / 10;a[len++] %= 10;}while (a[len]) len++;}void no_zeros(){int flag = 0;int cnt = 0;while (!a[flag] && flag < lf) flag++;for (int i = flag; i < len; i++) a[cnt++] = a[i];lf -= flag;while (!a[cnt-1] && cnt > lf + 1) cnt--;len = cnt; }};Bignum operator *(Bignum x, Bignum y){Bignum ret;ret.clear();for (int i = 0; i < x.len; i++)for (int j = 0; j < y.len; j++){ret.a[i+j] += x.a[i] * y.a[j];}ret.len = x.len + y.len;ret.lf = x.lf + y.lf;ret.carry();ret.no_zeros();return ret;}int _deal(char temp[]){int mark = 0;while (mark == '0' && temp[mark+1] != '.') mark++;return mark;}void _turn(Bignum &base, char temp[]){int l = strlen(temp);int li = 0;while (temp[li] != '.' && li < l) li++;int cnt = 0;for (int i = l-1; i >= 0; i--){if (temp[i] == '.') continue;base.a[cnt++] = temp[i] - '0';}base.len = cnt;base.lf = cnt - li;}void _print(Bignum ans){for (int i = ans.len - 1; i >= 0; i--){if (i == ans.len - 1 && ans.len == ans.lf + 1 && !ans.a[i]) ;else printf("%d", ans.a[i]);if (i == ans.lf && i) putchar('.');}putchar('\n');} int main(){Bignum base, ans;char r[L+2];int n;while (scanf("%s%d", r, &n) != EOF){//initbase.clear();ans.clear();ans.len = ans.a[0] = 1;//work_turn(base, r );while (n--) ans = ans * base;_print(ans);}return 0;}



0 0
原创粉丝点击