题目链接:Log函数问题
2 / 49 | Problem G | FZU 2032 | Log函数问题 |
不知道为什么...比赛时高精度难倒了一票人...成功搞出大新闻...
试了一下直接double相加超时,然后放弃(汗),然后double 有效数字最多16位的话,确实需要高精度了呢...
然后,机智的代码:
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int ans[200]; char num[210]; int main() { int n; while(~scanf("%d", &n)) { memset(ans, 0, sizeof(ans)); for (int i=0; i<n; ++i) { scanf("%s", num); int len = strlen(num); int point = 0; for (int i=0; i<len; ++i) { if (num[i] == '.') { point =i; break; } } int cnt = 100; // 整数部分 for (int i=point-1; i>=0; --i) { ans[cnt--] += num[i] - '0'; } // 小数部分 cnt = 101; for (int i=point+1; i<len; ++i) { ans[cnt++] += num[i] - '0'; } } for (int i=199; i>0; --i) { // 检查进位 ans[i-1] += ans[i] / 10; ans[i] %= 10; } if (ans[113] >= 5) ans[112]++; // 四舍五入 保留12位小数 for (int i=199; i>0; --i) { // 四舍五入之后检查进位 ans[i-1] += ans[i] / 10; ans[i] %= 10; } int out = 0; for (int i=0; i<113; ++i) { if (ans[i] || i == 100) out = 1; // 遇见第一个不是0的数 或者 到了小数部分 if (out) printf("%d", ans[i]); // 就可以直接输出了 if (i == 100) printf("."); } printf("\n"); } return 0; }
突然觉得acmerhaizhentingyukuaidene...
讲道理,高精度本来就是模拟ba...