真是信了邪,下面的代码死活AC不了,最后两个用例一直无法通过。
#include<iostream>
using namespace std;
int main()
{
int N;
cin >> N;
double ans=0.0;
double a[100001];
for(int i=0;i<N;i++)
{
cin >> a[i];
ans = ans+(i+1)*(N-i)*a[i];
}
printf("%.2f",ans);
return 0;
}
对照别人的代码睁大眼睛看了一个多小时,改了一下,通过了:
#include<iostream>
using namespace std;
int main()
{
int N;
cin >> N;
double ans=0.0;
double a[100001];
for(int i=0;i<N;i++)
{
cin >> a[i];
ans = ans+a[i]*(N-i)*(i+1);
}
printf("%.2f",ans);
return 0;
}
改动的地方仅仅是乘法的顺序。后来我想清楚了,计算机里乘法是没有结合律和交换律的,之所以前面的代码无法通过,因为先将两个大因子相乘,再乘第三个小因子的话,中间结果可能会超过double的范围。血泪教训。