1104 Sum of Number Segments
阿新 • • 發佈:2018-08-25
style 包括 sca 乘積最大 兩個 tmp 自身 pri code
2、不註意細節會有兩個測試點通不過!
因為n的最大值為100,000,因此語句1整數部分乘積最大為50,000*50,000>2^31-1,從而會造成溢出!(細節!基礎!)
代碼:
題意:
給出n個不大於1.0的小數序列,如{ 0.1, 0.2, 0.3, 0.4 },則共有10個分片(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) and (0.4)。現要求計算每個分片之和,即0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.
思路:數學題,找規律
1、以0.1 0.2 0.3 0.4 0.5 為例 0.1總共會被加1個5次(1*5),即由0.1作為起點發起的,0.1 、0.1 0.2、0.1 0.2 0.3、0.1 0.2 0.3 0.4、0.1 0.2 0.3 0.4 0.5 0.2總共會被加2個4次(2*4),即由0.1作為起點發起的,0.1 0.2、0.1 0.2 0.3、0.1 0.2 0.3 0.4、0.1 0.2 0.3 0.4 0.5 以及由0.2作為起點發起的,0.2、0.2 0.3、0.2 0.3 0.4、0.2 0.3 0.4 0.5 以此類推,某個數被相加的次數等於其左側的個數(包括其自身)與其右側的個數(包括其自身)之積,如下表a[i] | 0.1 | 0.2 | 0.3 | 0.4 | 0.5 |
在a[i]左側的個數(包括a[i]本身) | 1 | 2 | 3 | 4 | 5 |
在a[i]右側的個數(包括a[i]本身) | 5 | 4 | 3 | 2 | 1 |
下標i | 1 | 2 | 3 | 4 | 5 |
#include <stdio.h> int main() { int n; doublesum=0,tmp; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%lf",&tmp); //sum+=tmp*(i*(n-i+1));//錯誤 語句1 sum+=tmp*i*(n-i+1);//正確 } printf("%.2f\n",sum); return 0; }
1104 Sum of Number Segments