4.12 G

题目意思为输出一个三位小数,小数部分四舍五入后的误差总和,数据1e18

 

显然开longlong没法照顾到小数部分,long double没法到1e18

想一下会发现其实整数部分是没有用的,所以我们不妨直接把整数部分当作字符串读入,小数点后的部分直接当作整数用就好啦。

这样要注意,小数部分直接用的话,相当于把数值扩大了1000倍。最后要除以1000.

#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
#define d double
#define LL long long 
int n,f1,f2,ans;
LL a[100005];
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        ans=0;
        char c;
        for(int i=1;i<=n;i++)
        {
            while(cin>>c)
            {
                if(c=='.')break;
            }
            scanf("%d",&a[i]);
            int b;
            if(a[i]%10>=5)b=a[i]+(10-(a[i]%10));
            else b=a[i]-(a[i]%10);
            ans=ans+(b-a[i]);
        }
        printf("%.3lf\n",d(ans)/1000);
    }
    
}

 

posted @ 2021-04-13 12:44  Manjusaka丶梦寒  阅读(71)  评论(0编辑  收藏  举报