杭电1178

题意:第i层的硬币有i*(i+1)/2个,问总共有n(n<=2^31-1)层的总共有多少硬币,要求用科学计数法保留3位有效数字。

Analyse:
给出了第i层的金币数i*(i+1)/2,求的是n层的总金币数,
n^3=(n-1)^3+3*(n-1)^2+3*(n-1)+1
(n-1)^3=(n-2)^3+3*(n-2)^2+3*(n-2)+1
(n-2)^3=(n-3)^3+3*(n-3)^2+3*(n-3)+1
……
……
3^3=2^3+3*2^2+3*2+1
2^3=1^3+3*1^2+3*1+1
累加整理得sum=( (n+2)^3-(3*n^2+10*n+8) )/6。
但是数据最大有2^31-1,用int,__int64都不够大,幸好题目只要求用科学记数法保留三位有效数字。也正好,double就是这样的数据类型,能表示数字的范围很大,数量级有10的几百次方,只不过精度低。要注意的是在原来的代码中, 内循环的判断语句是(int)sum/10,这样是错的,临时数据转换后int就溢出了,sum大到一定程度就过不了,所以要坚持double这个数据类型。
View Code
 1 #include<stdio.h>
2 main()
3 {
4 double n,sum;
5 int digit;
6 while(scanf("%lf",&n)&&n)
7 {
8 sum=( (n+2)*(n+2)*(n+2)-(3*n*n+10*n+8) )/6;
9 digit=0;
10 while( sum/10>=1 )
11 {
12 digit++;
13 sum/=10;
14 }
15 printf("%.2lfE%d\n",sum,digit);
16 }
17 }
 
原文地址:https://www.cnblogs.com/ZShogg/p/2409738.html