首页 > 其他分享 >1049 数列的片段和

1049 数列的片段和

时间:2022-11-03 14:46:49浏览次数:66  
标签:片段 ll 数列 0.3 0.2 long sum 1049 1000

题目: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;
}

 

 

 

标签:片段,ll,数列,0.3,0.2,long,sum,1049,1000
From: https://www.cnblogs.com/yccy/p/16854397.html

相关文章

  • Python推导式创建数列的方法
    一、列表推导式列表推导式生成列表对象,语法如下:'''[表达式foritemin可迭代对象]或者[表达式foritemin可迭代对象if条件判断]'''例子l1=[xforxinr......
  • OJ周赛第一场——数列
    数列 问题描述给你一个长度为N的由0和1组成的整数序列:A=(A1,A2,⋯,AN​)。你可以选择是否进行一个操作。该操作为选择一个区间(l,r),使得区间的0变成1,1变成0。......
  • 斐波那契数列的java实现
    斐波那契数列指的是这样一个数列0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……特别指出:第0项是0,第1项是第一个1......
  • Berlekamp-Massey 算法(求数列的最短递推式)
    用于求数列的最短递推式。本文参考自https://www.cnblogs.com/jz-597/p/14983564.html。增量法,设\(R_i\)表示第\(i\)个历史递推式,当前为\(R_{cnt}\)。设\(\Delta......
  • 找到多个名为spring_web的片段。这是不合法的相对排序。有关详细信息,请参阅Servlet规
    问题描述:解决办法:1:检查pom.xml中是否包含多个spring-web字段;2:删除掉多余的spring-web.jar,保留一个即可;......
  • 求数列和
    #include<stdio.h>intmain(){ floata=1; floatb=2; floatsum=0; floatt; inti; for(i=0;i<20;i++){ sum+=b/a; t=b; b=a+b; a=......
  • MySQL常用代码片段
    概述每次想要实现一个功能时,总是百度Google,挺浪费时间的,于是整理得到此文。持续更新中。字符串截取函数length​​length(str)​​:返回str的长度left​​left(str,length)......
  • 剑指offer - 面试题9:斐波那契数列
    packageChapter2;/***面试题9:菲波那切数列*输入一个整数n,请你输出斐波那契数列的第n项。*1、1、2、3、5、8、13、21、34、*//**变形题:*一只青蛙一次可以跳上1级......
  • 1030 完美数列(二分查找法)
    题目: 给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。 现在给定参数 p 和一些正整数,请你从中选择尽可能......
  • P4145 上帝造题的七分钟 2 / #6281. 数列分块入门 5
    #include<iostream>#include<algorithm>#include<cmath>#include<cstring>usingnamespacestd;#definelllonglongconstintN=1e5+1;constintM=1e5+......