一、问题描述
有一堆煤球,堆成三角棱锥形。具体: 第一层放 1 个, 第二层 3 个(排列成三角形), 第三层 6 个(排列成三角形), 第四层 10 个(排列成三角形), .... 如果一共有 100000000 层,共有多少个煤球?
二、题目要求
考察
数学思想,规律 建议用时:10~20min
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
三、问题分析
本题主要考察两个重要的知识点:
第一个是每一层煤球的数量关系,能否找到每一层煤球的规律,否则暴力法不好做。
第二个是选取合理的常见存储类型存储定义,防止超出存储类型的范围,无法输出具体结果。
规律
第一层 1+0=1 第二层 1+2=3 第三层 3+3=6 第四层 4+6=10 ..... 第n层 n+前一层煤球数目
看了上面的一些数据之后,相关的规律是不是很快的出结果了。
具体的规律为:当前一层的煤球数目等于前一层的煤球数目加上当前的层数序号。
常见存储类型
类型 | 存储空间大小 | 最小值 | 最大值 |
char | 1个字节 | -128 | 127 |
float | 4个字节 | 3.4e-38 | 3.4e+38 |
int | 4个字节 | -2 147 483 648 | 2 147 483 647 |
long | 4个字节 | -2 147 483 648 | 2 147 483 647 |
double | 8个字节 | 1.7e-308 | 1.7e+308 |
long long | 8个字节 | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
double和float存储范围很大,但毕竟是浮点型,题目的结果使用long long 整形存储也完全可以。
四、编码实现
usingnamespacestd; longlonginta=1,b,sum=1;//lng long 初始化定义煤球数目sum等于1,算作第一层intmain() { inti,n;//初始化定义cin>>n;//输入nfor(i=2;i<=n;i++)//从第二层开始循环相加 { b=a+i;//后一个数字等于前面一个数字加上一个当前下标sum+=b;//相加等于煤球数总和a=b;//交替出现 } cout<<sum;//输出结果return0; }
五、输出结果
输出具体结果为:338960700901149440