博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
杭电1178
阅读量:6293 次
发布时间:2019-06-22

本文共 944 字,大约阅读时间需要 3 分钟。

题意:第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
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/archive/2012/03/21/2409738.html

你可能感兴趣的文章
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>
收费视频网站Netflix:用户到底想要“点”什么?
查看>>
MacOS High Sierra 12 13系统转dmg格式
查看>>
关于再次查看已做的多选题状态逻辑问题
查看>>
动态下拉菜单,非hover
查看>>
政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信...
查看>>
简单易懂的谈谈 javascript 中的继承
查看>>
iOS汇编基础(四)指针和macho文件
查看>>
Laravel 技巧锦集
查看>>
Android 使用 ViewPager+RecyclerView+SmartRefreshLayout 实现顶部图片下拉视差效果
查看>>