PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!
文章目錄
- 題目分析
- 題目鏈接
題目分析
來源:acwing
分析:本題題意比較簡單,但是不能僅僅根據(jù)定義來算。
本題思路:統(tǒng)計(jì)每個(gè)數(shù)在多少個(gè)區(qū)間出現(xiàn)過,也就是這個(gè)數(shù)需要加多少次。共有n個(gè)數(shù),其中第i個(gè)數(shù)在多少個(gè)區(qū)間出現(xiàn)過呢? 如下圖:
ac代碼
第一層:
請注意數(shù)據(jù)溢出, int * int 的時(shí)候105×10510^5\times 10^5105×105相乘會溢出int!所以不能寫成int * int * double,這種寫法在計(jì)算int * int的時(shí)候會溢出。
第二層:
而是要寫成double * int * int 這樣,double * int計(jì)算的時(shí)候會進(jìn)行隱式類型轉(zhuǎn)化,轉(zhuǎn)換成高精度的double,然后它的結(jié)果(double類型)再和int相乘,再進(jìn)行類型轉(zhuǎn)換,還是double類型。
第三層:
But ,不要高興得太早!!!PAT又加強(qiáng)數(shù)據(jù)了,double也存不下了,下面測試點(diǎn)2的數(shù)據(jù)已溢出double。需要long double類型,對應(yīng)的輸出不是%lf,而是大寫的%Lf!!!或者是%llf
是:printf("%.2Lf",res); 是:printf("%.2llf",res);不是: printf("%.2lf",res);下面是C語言printf的格式說明:
%e, %E : 浮點(diǎn)數(shù)使用科學(xué)符號表示之,指數(shù)將帶正負(fù)號, float x,doubley;
%f : 單精度浮點(diǎn)數(shù)(預(yù)設(shè)輸出精度6位), float x;
(註 : 對 printf 而言, %f/%lf 可適用於 double / float)
%lf : 倍精度浮點(diǎn)數(shù)(預(yù)設(shè)輸出精度6位), double x;
%llf, %LF : 雙倍精度浮點(diǎn)數(shù)(預(yù)設(shè)輸出精度6位), long double x;
%g, %G : 由系統(tǒng)決定是否採科學(xué)符號表示。
參考來源:https://edisonx.pixnet.net/blog/post/35305668
C語言的類型轉(zhuǎn)換請參考一篇好文:csdn博主zhuimengzh文章:C語言中的整數(shù)自動轉(zhuǎn)換原則
題目鏈接
PAT甲級1104 Sum of Number Segments
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1103 Integer Fa
- 下一篇: PAT甲级1007 Maximum Su