浮点高精求和(洛谷P2393题题解,弃坑Java拥抱C++)
題目要求
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?我下了數據,是空文件,連換行符都沒有……
我原本以為數據錯了,可能有換行符的,就加了一個特判:
結果一樣的,真的惡心啊。
你用nextLine()或者readLine()沒用的,根本不行。
用任何Scanner都不能過,只能用BufferedReader,但也沒什么頭緒,畢竟BufferedReader一般來說只能讀取一行或者一個字符,都不合適。
想了很久,就琢磨出一個騷方法:
沒錯,先讀首字符,如果沒有就拜拜,打印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++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】PyCharm中Matp
- 下一篇: 常见的新算法的标准测试函数(Ackely