PAT B1049 數列的片段和 20

2021-10-21 03:36:16 字數 1490 閱讀 9953

1049 數列的片段和 (20 分)

給定乙個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列 ,我們有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 這 10 個片段。

給定正整數數列,求出全部片段包含的所有的數之和。如本例中 10 個片段總和是 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

輸入格式:

輸入第一行給出乙個不超過 10^​5的正整數 n,表示數列中數的個數,第二行給出 n 個不超過 1.0 的正數,是數列中的數,其間以空格分隔。

輸出格式:

在一行中輸出該序列所有片段包含的數之和,精確到小數點後 2 位。

輸入樣例:

40.1 0.2 0.3 0.4

輸出樣例:

5.00

暴力破解法

#include

intmain()

double sum=0;

for(

int i=

0;iprintf

("%.2f"

,sum)

;return0;

}

找規律:

第i個數出現的總次數等於i*(n+1-i),於是總和就等於σ(i*次數)。

#include

intmain()

printf

("%.2f\n"

,ans/

1000.0);

return0;

}

以下是柳神部落格原文 「n比較大時,double型別的值多次累加導致的精度誤差,因為輸入為十進位制小數,儲存到double中時,計算機內部使用二進位制表示,且計算機的字長有限,有的十進位制浮點數使用二進位制無法精確表示只能無限接近,在字長的限制下不可避免會產生捨入誤差,這些細微的誤差在n較大時多次累加會產生較大誤差,所以建議不要使用double型別進行多次累加的精確計算,而是轉為能夠精確儲存的整型。嘗試把輸入的double型別的值擴大1000倍後轉為long long整型累加,同時使用long long型別儲存sum的值,輸出時除以1000.0轉為浮點型再輸出(相當於把小數點向後移動3位後再計算,避免double型別的小數部分儲存不精確,多次累加後對結果產生影響) 但我覺得乘以1000也未必嚴謹,可能測試樣例最小只有小數點後三位,如果測試樣例變成小數點後四位、五位、六位,乘以1000相當於直接在小數點後三位處截斷,而原本第四五六位經過多次累加進製後依然可能會引起精度問題,但如果乘以10000就會超出long long的值,我認為最精確的應該是擷取到所有小數中最大的位數的那一位。。可能我的想法有疏漏,經過測試,測試樣例確實沒有超過小數點後三位,雖然修改為乘以1000後**已經ac,但如果對測試樣例稍加修改,可能又會導致不ac了…所以這道題先打個問號吧,我猜可能將來題目樣例還會被修改…」

PAT B1049 數列的片段和

給定乙個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列,我們有 0.1 0.1,0.2 0.1,0.2,0.3 0.1,0.2,0.3,0.4 0.2 0.2,0.3 0.2,0.3,0.4 0.3 0.3,0.4 0.4 這10個片段。給定正整數數列,求出全部片段包含的所有...

PAT B1049 數列的片段和 20

1049 數列的片段和 20 20 分 給定乙個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列,我們有 0.1 0.1,0.2 0.1,0.2,0.3 0.1,0.2,0.3,0.4 0.2 0.2,0.3 0.2,0.3,0.4 0.3 0.3,0.4 0.4 這10個片段...

PAT B1049 數列的片段和 (20 分

1049 數列的片段和 20 分 給定乙個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列 我們有 0.1 0.1,0.2 0.1,0.2,0.3 0.1,0.2,0.3,0.4 0.2 0.2,0.3 0.2,0.3,0.4 0.3 0.3,0.4 0.4 這 10 個片段。...