算法题每日一练---第23天:煤球数目

454 阅读2分钟

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战

一、问题描述

有一堆煤球,堆成三角棱锥形。具体: 第一层放 1 个, 第二层 3 个(排列成三角形), 第三层 6 个(排列成三角形), 第四层 10 个(排列成三角形), .... 如果一共有 100000000 层,共有多少个煤球?

二、题目要求

考察

1.数学思想,规律
2.建议用时:10~20min

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

三、问题分析

本题主要考察两个重要的知识点:

第一个是每一层煤球的数量关系,能否找到每一层煤球的规律,否则暴力法不好做。

第二个是选取合理的常见存储类型存储定义,防止超出存储类型的范围,无法输出具体结果。

规律

第一层     1+0=1
第二层     1+2=3
第三层     3+3=6
第四层     4+6=10
.....
第n层     n+前一层煤球数目

看了上面的一些数据之后,相关的规律是不是很快的出结果了。

具体的规律为:当前一层的煤球数目等于前一层的煤球数目加上当前的层数序号。

常见存储类型

类型存储空间大小最小值最大值
char1个字节-128 127
float4个字节3.4e-383.4e+38
int4个字节-2 147 483 6482 147 483 647
long4个字节-2 147 483 6482 147 483 647
double8个字节 1.7e-3081.7e+308
long long8个字节-9 223 372 036 854 775 8089 223 372 036 854 775 807

double和float存储范围很大,但毕竟是浮点型,题目的结果使用long long 整形存储也完全可以。

四、编码实现

#include<iostream>
using namespace std;
long long int a=1,b,sum=1;//lng long 初始化定义煤球数目sum等于1,算作第一层
int main()
{
	int i,n;//初始化定义
	cin>>n;//输入n
	for(i=2;i<=n;i++)//从第二层开始循环相加
	{
		b=a+i;//后一个数字等于前面一个数字加上一个当前下标
		sum+=b;//相加等于煤球数总和
		a=b;//交替出现
	}
	cout<<sum;//输出结果
	return 0;
}

五、输出结果

输出具体结果为:338960700901149440 1.png