题目要求

P2393题目链接

分析

这题实则是变态的大浮点加法,众所周知的是浮点不精确,按照IEEE754来。
原先使用Java写的,但下面分析一下为什么不能用Java写。

这代码本来是这么写的:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);double sum = 0.0;String[] array = scanner.nextLine().trim().split("\\s+");scanner.close();for (String s : array) {sum += 1000000 * Double.parseDouble(s);}System.out.printf("%.5f", sum/1000000);}
}

但结果是这样的:

你们敢想象为什么RE?我下了数据,是空文件,连换行符都没有……
我原本以为数据错了,可能有换行符的,就加了一个特判:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);double sum = 0.0;String line = scanner.nextLine();if ("".equals(line)) {System.out.println("0.00000");return;}String[] array = line.trim().split("\\s+");scanner.close();for (String s : array) {sum += 1000000 * Double.parseDouble(s);}System.out.printf("%.5f", sum/1000000);}
}

结果一样的,真的恶心啊。
你用nextLine()或者readLine()没用的,根本不行。
用任何Scanner都不能过,只能用BufferedReader,但也没什么头绪,毕竟BufferedReader一般来说只能读取一行或者一个字符,都不合适。
想了很久,就琢磨出一个骚方法:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public strictfp static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));double sum = 0.0;int firstRead = reader.read();if (firstRead == -1) {System.out.println("0.00000");return;}firstRead -= 48;String line = firstRead + reader.readLine();String[] array = line.trim().split("\\s+");reader.close();for (String s : array) {sum += 1000000 * Double.parseDouble(s);}System.out.printf("%.5f", sum/1000000);}
}

没错,先读首字符,如果没有就拜拜,打印0.00000,否则就拼接起来呗……
只过了第一个,后5个还是WA:

下了一个数据6,震惊,被恶心到了,double拼起来必定不精确啊,一看确实,误差挺大。

我后来加上了strictfp关键词,发现对double无效。(这个词研究不深,但测过多次,盲猜是让float按照IEEE754算,对double没啥大用……)

突然灵机一动,高精?我上BigDecimal吧,高精没毛病:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.math.RoundingMode;public class Main {public strictfp static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));BigDecimal sum = new BigDecimal(0).setScale(5, RoundingMode.HALF_EVEN);;int firstRead = reader.read();if (firstRead == -1) {System.out.println("0.00000");return;}firstRead -= 48;String line = firstRead + reader.readLine();String[] array = line.trim().split("\\s+");reader.close();for (String s : array) {sum = sum.add(new BigDecimal(Double.parseDouble(s)));}System.out.printf("%.5f", sum);}
}

结果只能说略有改观吧:

测试点6和8过不去的,对比发现我们的BigDecimal算的过于精确了……比给的answer精确……
我瞬间心态爆炸……
读到这里您也能想到我为了各种测试画了多少时间和精力吧,居然不是不精确就是过精确。
偏偏Java没有 long double 这回事,枯萎……

然后我弃坑Java,拾起C++,十行以内秒了这题。。。

一句题外话是:性能差距过大。

提示:洛谷的OJ基本面向中学信息学竞赛,所以C++是王道,你用Java人家不理你的,见好就收即可,嗯……

AC代码(C++语言描述)

#include<cstdio>
long double result, temp;
int main() {while((scanf("%Lf", &temp)) != EOF) {result += temp * 1000000;}printf("%.5Lf", result / 1000000);return 0;
}

浮点高精求和(洛谷P2393题题解,弃坑Java拥抱C++)相关推荐

  1. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  2. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  3. 贪心策略摘果子(洛谷P1478题题解,Java语言描述)

    题目要求 P1478题目链接 分析 本题的低配版题目链接 → 题解 那个题就是纯水题没啥可写的,我除了贴代码无话可说,但这题吧,虽然不算难,但也可一说. 建议大家移步这里 → 精辟题解 这位爷写了本题 ...

  4. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

  5. 修改数组(洛谷P7285题题解,C++语言描述)

    题目要求 P7285题目链接 分析 这题虽然是红题,但是因为很有趣且是 Special Judge ,所以写篇题解. 乍一看,这题好麻烦啊,要综合考虑xxx和yyy,达到x−yx-yx−y的最优化. ...

  6. 麦森数(洛谷P1045题题解,Java语言描述)

    题目要求 题目链接 分析 这题挺经典的,快速幂取模算法,如果求出大数再取模就可能T掉. 之前有篇文章写了这个算法:<快速幂算法详解&&快速幂取模算法详解> 既然是Java, ...

  7. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  8. 求子集元素之和(洛谷P2415题题解,Java语言描述)

    题目要求 P2415题目链接 分析 这题我觉得--当个数学题做就好了嘛. 有一个数N的情况:result = 1 * N 有两个数N1.N2的情况:result = 2 * (N1+N2) 有三个数N ...

  9. 遍历Map要选择好的遍历方式(洛谷P1097题题解,Java语言描述)

    题目要求 P1097题目连接 分析 这题标签里有一个"高性能",瞬间令我心惊胆战,毕竟Java嘛. 我们应该会写排序,比如快排,但可以利用现成的数据结构啊,本来想的是TreeSet ...

最新文章

  1. 优达学城《DeepLearning》2-3:权重初始化
  2. 伪元素的margin值挤压主体元素解决
  3. 【网工必备】网络端口号大全......
  4. 电脑安装android2.0,电脑上怎么安装使用安卓系统
  5. 1022: [SHOI2008]小约翰的游戏John【Nim博弈,新生必做的水题】
  6. 【技术文档】JEECG 页面字典控件与Popup使用
  7. python字符子串_子字符串和子序列(Python),子串,python
  8. ios跨线程通知_iOS多线程编程指南(三)Run Loop
  9. Linux苹果工具,Projectsandcastle:一款针对iPhone的AndroidLinux支持工具
  10. C语言学习笔记《带你学C带你飞》P41-P61
  11. “怀孕后,老公居然背着我做这些事”:有没有嫁对人,看这点就知道了
  12. python 文本转excel_Python 文本(txt) 转换成 EXCEL(xls)
  13. Java 之 Serializable 序列化和反序列化的概念,作用的通俗易懂的解释
  14. 7.31 XMap
  15. 长文图解:金字塔原理如何指导技术系统优化
  16. Verilog HDL 语法学习笔记
  17. 音频转换成文字的方法你知道吗?操作非常简单
  18. oracle 等待的进程,Oracle 等待事件:ges generic event
  19. 水星UD6S网卡Linux驱动,水星UD6S驱动程序官方版
  20. 智慧城市同城V4 v2.1.7 同城 同城小程序 同城信息

热门文章

  1. NO.10章 图(遍历、最短路、生成树、拓扑、关键路径)
  2. HTML 列表中的dl,dt,dd,ul,li,ol区别及应用
  3. R语言-时间日期函数
  4. ArcGIS API for Silverlight中legend控件显示图例问题
  5. android surfaceview 清屏
  6. 关于 VB,VC,Delphi,SDK 的笑话
  7. Linux版本配置环境变量,如何linux环境下配置环境变量过程图解
  8. android 滚动列表框,建立滚动列表框
  9. jsp判断json第一位_java 判断字符串是否为json格式
  10. Vue与Element入门使用