题目链接: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...

posted on 2016-04-09 15:54  小小八  阅读(227)  评论(0编辑  收藏  举报