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;
}