这题代码很简单,如下:
#include <cstdio>
int main(){
int n;
scanf("%d",&n);
double sum;
for (int i=0; i<n; i++){
double temp;
scanf("%lf",&temp);
sum+=temp*(n-i)*(i+1);
}
printf("%.2f",sum);
}
但是,如果这么写:
#include <cstdio>
int main(){
int n;
scanf("%d",&n);
double sum;
for (int i=0; i<n; i++){
double temp;
scanf("%lf",&temp);
sum+=(n-i)*(i+1)*temp;
}
printf("%.2f",sum);
}
第三第四个测试点就通过不了,神奇。
为什么第二段代码会出问题呢?可能的一个原因是溢出,即 (n-i)*(i+1) 实际上已经超出了 int 类型的范围
−
2
31
到
2
31
−
1
-2^{31}到2^{31}-1
−231到231−1
n最大值大概是10^5, 所以(n-i)*(i+1)的最大值是(10^10)/4,已经超过了int 范围的最大值,导致溢出错误。
这种溢出很隐蔽,很难被发现(当然,可能是我程序写少了)。