此題有纪念意义:
如果两个int数很大,结果需要放到double型里面,
那么第一步请先乘以 1.0,转化成double型否则可能中间结果溢出,导致得不到正确答案
比如
int n;
// n可能很大,
double sum=0;
sum=n*(n+1)*(n+2)/6.0;
如果我们不在第一步乘以1.0,那么n*(n+1) 可能就已经溢出,结果自然是错误的,所以正确的写法是。
sum=1.0*n*(n+1)*(n+2)/6.0;
这样第一步就是double型了,不会溢出。
AC代码:
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
int n;
double sum=0;
int k=0;
while(scanf("%d",&n)!=EOF){
if(n==0) break;
//1.0 must be first because need to convert to double
sum=1.0*(n+1)*(n+2)*n/6;
k=0;
while(sum>=10){
k++;
sum/=10;
}
printf("%.02lfE%d\n",sum,k);
}
return 0;
}