1049 数列的片段和

题目:1049 数列的片段和

 

给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列 { 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。

 

输入格式:

 

输入第一行给出一个不超过 105 的正整数 N,表示数列中数的个数,第二行给出 N 个不超过 1.0 的正数,是数列中的数,其间以一个空格分隔。

 

输出格式:

 

在一行中输出该序列所有片段包含的数之和,精确到小数点后 2 位。

 

输入样例:

4
0.1 0.2 0.3 0.4

 

输出样例:

5.00

 

思路: 

1、此题测试点二答案错误:因为输入为十进制小数,存储到double中时,计算机内部使用二进制表示,且计算机的字长有限,有的十进制浮点数使用二进制无法精确表示只能无限接近,在字长的限制下不可避免会产生舍入误差。 这些细微的误差在N较大时多次累加会产生较大误差,所以建议不要使用double类型进行多次累加的精确计算,而是转为能够精确存储的整型。

解法一:尝试把输入的double类型的值扩大1000倍后转为long long整型累加,同时使用long long类型保存sum的值,输出时除以1000.0转为浮点型再输出(相当于把小数点向后移动3位后再计算,避免double类型的小数部分存储不精确,多次累加后对结果产生影响)

乘以1000也未必严谨,可能测试样例最小只有小数点后三位,如果测试样例变成小数点后四位、五位、六位,乘以1000相当于直接在小数点后三位处截断,而原本第四五六位经过多次累加进位后依然可能会引起精度问题,但如果乘以10000就会超出long long的值,我认为最精确的应该是截取到所有小数中最大的位数的那一位。

解法二:直接用long double 类型来存

 

2、修改(思考为什么?)

sum = sum + (ll)1000 * a[i] * (n - i) + (ll)1000 * a[i] * i + (ll)1000 * a[i] * (n - i - 1) * i;
->
ll x = (ll)1000 * a[i] * (n - i);
ll y = (ll)1000 * a[i] * i;
ll z = (ll)1000 * a[i] * (n - i - 1) * i;
sum = sum + x + y + z;

代码:

 方法一:

#include<stdio.h>
#include<iostream>
#include<iomanip>
typedef long long ll; 
using namespace std;
int main(){
    int n;
    double a[1000005];
    ll sum = 0;
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>a[i];
    }
    for(int i=0; i<n; i++){
        ll x = (ll)1000 * a[i] * (n - i);
        ll y = (ll)1000 * a[i] * i;
        ll z = (ll)1000 * a[i] * (n - i - 1) * i;
        sum = sum + x + y + z;
    }
    printf("%0.2lf", sum * 1.0/1000);
    
    return 0;
}

 

方法二:(long double - %llf)

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

 

 

 

🔗引用:https://blog.csdn.net/liuchuo/article/details/51994905?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159644685119725222453390%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159644685119725222453390&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-1-51994905.pc_v2_rank_blog_v1&utm_term=1049+%E6%95%B0%E5%88%97%E7%9A%84%E7%89%87%E6%AE%B5%E5%92%8C+%2820%E5%88%86%29&spm=1018.2118.3001.4187

posted @ 2022-11-03 14:36  Yohoc  阅读(45)  评论(0编辑  收藏  举报