日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!

發布時間:2025/4/5 c/c++ 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 題目分析
    • 題目鏈接

題目分析


來源:acwing

分析:本題題意比較簡單,但是不能僅僅根據定義來算。
本題思路:統計每個數在多少個區間出現過,也就是這個數需要加多少次。共有n個數,其中第i個數在多少個區間出現過呢? 如下圖:

ac代碼

#include <iostream>using namespace std;int main() {int n;cin >> n;long double res = 0;for (int i = 1; i <= n; i ++ ){long double x;cin >> x;res += x * i * (n - i + 1);}printf("%.2Lf", res);return 0; }

第一層:

請注意數據溢出, int * int 的時候105×10510^5\times 10^5105×105相乘會溢出int!所以不能寫成int * int * double,這種寫法在計算int * int的時候會溢出。

第二層:

而是要寫成double * int * int 這樣,double * int計算的時候會進行隱式類型轉化,轉換成高精度的double,然后它的結果(double類型)再和int相乘,再進行類型轉換,還是double類型。

第三層:

But ,不要高興得太早!!!PAT又加強數據了,double也存不下了,下面測試點2的數據已溢出double。需要long double類型,對應的輸出不是%lf,而是大寫的%Lf!!!或者是%llf

是:printf("%.2Lf",res); 是:printf("%.2llf",res);不是: printf("%.2lf",res);

下面是C語言printf的格式說明:

%e, %E : 浮點數使用科學符號表示之,指數將帶正負號, float x,doubley;
%f : 單精度浮點數(預設輸出精度6位), float x;
(註 : 對 printf 而言, %f/%lf 可適用於 double / float)
%lf : 倍精度浮點數(預設輸出精度6位), double x;
%llf, %LF : 雙倍精度浮點數(預設輸出精度6位), long double x;
%g, %G : 由系統決定是否採科學符號表示。
參考來源:https://edisonx.pixnet.net/blog/post/35305668

#include<bits/stdc++.h> using namespace std;int main(){int n;cin >> n;double res = 0;for(int i =1; i<=n; i++){double x;cin >> x;//可能會溢出int,因此double類型的數據寫在前,使之變成double類型res += x *i*(n-i+1);}printf("%.2lf",res);}

C語言的類型轉換請參考一篇好文:csdn博主zhuimengzh文章:C語言中的整數自動轉換原則

題目鏈接

PAT甲級1104 Sum of Number Segments

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的PAT甲级1104 Sum of Number Segments:[C++题解]数段之和,测试点2爆double,请用long double!!!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。