注解
1、本题是求1+3+6+…+N(N+1)/2的和,其求和公式为N*(N+1)*(N+2)/6。推导过程如下:
1 * n + 2 (n - 1) + 3 (n - 2) + …… + (n - 2) * 3 + (n - 1) * 2 + n * 1
= 1 * (n + 1 - 1) + 2 (n + 1 - 2) + 3 (n + 1 - 3) + …… + (n - 2) * (n + 1 - (n - 2)) + (n - 1) * (n + 1 - n - 1) + n * (n + 1 - n)
= (1 + 2 + 3 + ... + n)(n + 1) - (1^2 + 2^2 + 3^2 + ..... + n^2)
= n (n + 1)^2 / 2 - n (n + 1) (2n + 1) / 6 (n (n + 1) (2n + 1) / 6后面会证明)
= n * (n + 1) * (n + 2) / 6
2、输出结果使用科学记数法,用(int)log10(ans)求出其位数。
代码
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
scanf("%d", &n);
while(n){
double ans = (double)n*(n+1)*(n+2)/6.0;
int len = (int)log10(ans);
ans /= pow(10, len);
printf("%.2lfE%d\n", ans, len);
scanf("%d", &n);
}
return 0;
}