1049 数列的片段和 (20 分)

原题

https://pintia.cn/problem-sets/994805260223102976/problems/994805275792359424

思路

1.刚开始我想的是两个循环。超时
2.发现每个数列相加的总个数是有规律的。比如0.1 0.2 0.3 0.4——》4*1次 3*2次 2*3次 1*4次
3.然后又发现精确度不够,怎么double了还是不够?。。

小数部分计算过程精度会丢失,可以先乘一个较大的数计算后再除回去

代码

初始化版部分对

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(void){
	int n;
	cin>>n;
	float f[100000],sum,total=0;
	
	for(int i=0;i<n;i++){
		scanf("%f",&f[i]);
	}
	
	for(int i=0;i<n;i++){
        sum=0;
		for(int j=i;j<n;j++){
			sum+=f[j];
            total+=sum;
		}
	}	
	printf("%.2f",total);
	return 0;
}

找规律版,测试点2不过

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(void){
	int n;
	cin>>n;
	double f=0,sum=0;
	
	for(int i=0;i<n;i++){
		cin>>f;
		sum+=f*(n-i)*(i+1);
	}
	printf("%.2f",sum);
	return 0;
}

最后柳大佬的,哎,计算过程中乘以1000,防止小数部分精度丢失吧。我这么理解的

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(void){
	int n;
	cin>>n;
	double f=0.0;
	long long sum=0;
	
	for(int i=0;i<n;i++){
		cin>>f;
		sum+=(long long)(f*1000*(n-i)*(i+1));
	}
	printf("%.2f",sum/1000.0);
	return 0;
}
posted @ 2021-12-18 23:39  Infinite_V胜  阅读(20)  评论(0)    收藏  举报