PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)

Posted caiyishuai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)相关的知识,希望对你有一定的参考价值。

1104 Sum of Number Segments (20分)
 

Given a sequence of positive numbers, a segment is defined to be a consecutive subsequence. For example, given the sequence { 0.1, 0.2, 0.3, 0.4 }, we have 10 segments: (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).

Now given a sequence, you are supposed to find the sum of all the numbers in all the segments. For the previous example, the sum of all the 10 segments is 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N, the size of the sequence which is no more than 1. The next line contains N positive numbers in the sequence, each no more than 1.0, separated by a space.

Output Specification:

For each test case, print in one line the sum of all the numbers in all the segments, accurate up to 2 decimal places.

Sample Input:

4
0.1 0.2 0.3 0.4
 

Sample Output:

5.00

 

题意:

给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(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,在一行中输出该序列所有片段包含的数之和,精确到小数点后2位~

题解:

技术图片

 

 

将数列中的每个数字读取到temp中,假设我们选取的片段中包括temp,且这个片段的首尾指针分别为p和q,那么对于p,有i种选择,即12…i,对于q,有n-i+1种选择,即i, i+1, … n,所以p和q组合形成的首尾片段有i * (n-i+1)种,因为每个里面都会出现temp,所以temp引起的总和为temp * i * (n – i + 1);遍历完所有数字,将每个temp引起的总和都累加到sum中,最后输出sum的值~
————————————————
版权声明:本文为CSDN博主「柳婼」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuchuo/article/details/51985824

 

真的很细节 挖了好多次。 int*int*double 转换是 int*int 变为 int ,然后 int *double

但是 当 i 去100000时 int *int 可能会溢出,然后就答案错误,解决方法要么把int换为long long 要么把 double 提前 

使得 double * int 变为 double
————————————————
版权声明:本文为CSDN博主「Cute_jinx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Cute_jinx/article/details/82497800

AC代码:

 

#include<bits/stdc++.h>
using namespace std;
double a;
int n;
double s=0.0;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a;
        s+=a*i*(n-i+1);    
        //int*int*double 转换是 int*int 变为 int ,然后 int *double
        //当 i 去100000时 int *int 可能会溢出,然后就答案错误,
        //解决方法要么把int换为long long 要么把 double 提前 使得 double * int 变为 double 
        //s+=(n-i+1)*i*a最后两个测试点过不了    
    }
    printf("%.2f",s);
    return 0;
} 

 

以上是关于PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)的主要内容,如果未能解决你的问题,请参考以下文章

PAT 甲级 1104 Sum of Number Segments (20分)(有坑,int *int 可能会溢出)

PAT 1104 Sum of Number Segments

1104. Sum of Number Segments (20)数学题——PAT (Advanced Level) Practise

PAT (Advanced Level) 1104. Sum of Number Segments (20)

1104. Sum of Number Segments (20)数学题——PAT (Advanced Level) Practise

1104. Sum of Number Segments (20)数学题——PAT (Advanced Level) Practise