题意:
给出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 |
2、不注意细节会有两个测试点通不过!
因为n的最大值为100,000,因此语句1整数部分乘积最大为50,000*50,000>2^31-1,从而会造成溢出!(细节!基础!)
代码:
#include <stdio.h> int main() { int n; double sum=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; }
原文地址:https://www.cnblogs.com/kkmjy/p/9533187.html
时间: 2024-11-06 03:36:35