这个题目感觉出的不是很好,如果要考察double导致的精度问题。其实可以在题目末尾note,稍微提醒一下题目会在double精度问题上出考点,那就好了。考生应该是去解决问题,而不是猜问题。看了这位老哥写的非常好,https://blog.zhengrh.com/post/about-double/。其实学过计组的都知道,其实计算机用二进制是无法精确表达一些小数的,例如
0.3在二进制中只能近似表达,那么如果是用较大的数乘计算机中存储的0.3。就会出现误差,只能用string文本类型保存输入,并且自己写string类型的乘法才是精确的答案。
但是这道题把double改成long double就能过测试点了。但是并不代表这个做法是完全对的,因为只是在测试用例的精度没问题。本来用浮点数就一定会有精度问题。
#include<bits/stdc++.h>
using namespace std;
vector<int> v;
int main() {
int n;
long double sum = 0.0, a;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
cin >> a;
sum += a * i * (n - i + 1);
}
printf ("%.2llf", sum);
}