题目:
Time Limit: 500MS | Memory Limit: 10000K | |
Total Submissions: 139077 | Accepted: 33994 |
Description
Input
Output
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
思路:
把输入全部转换成整数,剔除小数点,按整数高精度运算后再加入小数点
代码:
//21:10 -- 23:11 #include <stdio.h> #include <string.h> char res[10006], sa[10006], sb[10006], tsb[10006]; void show(char *s) { char *p; if (*s == 0 && *(s + 1) == -2) ++s; if (*s == -2 && *(s + 1) == -1) { printf("0"); return; } p = s; while (*++p != -1) ; --p; while (*p != -2 && *p == 0) --p; if (*p == -2) --p; ++p; while (s != p) { if (*s == -2) putchar('.'); else putchar('0' + *s); ++s; } } void pre(char *s) { while (*s != '\0') { if (*s == '.') *s = -2; else *s -= '0'; ++s; } *s = -1; } void owncpy(char *s, char *p) { while (*p != -1) { *s++ = *p++; } *s = -1; } char* multiple(char *s, char *a, char *b) { memset(s, 0, sizeof(char) * 10006); int i, flags = 0, lena = 0, lenb = 0, ea, eb; for (i = 0; a[i] != -1; ++i) { if (flags == 1) { a[i - 1] = a[i]; lena++; } if (a[i] == -2) { flags = 1; lena = 0; } } ea = flags ? i - 2 : i - 1; flags = 0; for (i = 0; b[i] != -1; ++i) { if (flags == 1) { b[i - 1] = b[i]; lenb++; } if (b[i] == -2) { flags = 1; lenb = 0; } } eb = flags ? i - 2 : i - 1; int x, y, c; s[10001] = -1; for (x = ea; x >= 0; --x) { for (y = eb; y >= 0; --y) { c = 10000 - (ea - x + eb - y); s[c] += a[x] * b[y]; if (s[c] > 9) { int tp = s[c] / 10; s[c] %= 10; s[c - 1] += tp; } } } int first = 10000 - (ea + eb + 5); while (first <= 10000 && s[++first] == 0) ; int f = 0, ploc; if (lena + lenb >= 10000 - first + 1) { s[f++] = 0; s[f++] = -2; int k = lena + lenb - (10000 - first + 1); while (k--) s[f++] = 0; } else { ploc = 10000 - lena - lenb; while (first <= ploc) s[f++] = s[first++]; s[f++] = -2; } while (first <= 10000) s[f++] = s[first++]; s[f] = -1; return s; } void ownpow(int n) { while (--n) { multiple(res, sa, sb); owncpy(sa, res); owncpy(sb, tsb); } } int main() { int n; while (~scanf("%s %d", sa, &n)) { pre(sa); owncpy(sb, sa); owncpy(tsb, sa); owncpy(res, sa); ownpow(n); show(res); printf("\n"); } return 0; }
原文地址:http://blog.csdn.net/xianyun2009/article/details/41687533