lanqiaobei8
[每周例题1]蓝桥杯c++ 1463.货物摆放
题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L, W, H的货物, 满足 n = L * W * H。
给定 n,请问有多少种堆放货物的方案满足要求。
例如,当n = 4 时,有以下 66 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1、1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1。
请问,当 n = 2021041820210418n = 2021041820210418 (注意有 1616 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main()
{
// 请在此输入您的代码
long long n = 2021041820210418;
vector<long long> factor;
for (int i = 1; i <= sqrt(n); i++)
{
if (n % i == 0)
{
factor.push_back(i);//找到一个因子,压进容器
if (n / i != i) {
factor.push_back(n / i);//用小因子找大因子,判断对立因子,如果不等于i,也压进容器
}
}
}
vector<long long>::iterator a, b, c;//创建迭代器
int count = 0;
for (a = factor.begin(); a < factor.end(); a++)//遍历三次factor将因子放置在三位置中的任意位置
{
for ( b = factor.begin(); b < factor.end(); b++)
{
for (c = factor.begin(); c < factor.end(); c++)
{
if ((*a) * (*b) * (*c)==n)
{
/*cout << *a << "*" << *b << "*" << *c << endl;*/
count++;
}
}
}
}
cout << count << endl;
return 0;
}
对该题的理解:
如果我们直接用三层for循环遍历暴力查找2021041820210418的所有计算组合,计算量将非常大,时间复杂度也将很大,计算机运行都可能需要几天的时间,所以就需要另外思考其他方法
解法:
找出2021041820210418的所有符合因子,用2021041820210418较小的因子拿到较大的因子(如1*2021041820210418;2*10105209101005209)将大小因子都压进vector<long long>中然后遍历三次vector<long long>将其中的因子三三相乘判断与2021041820210418是否相等,定义一个count,每相等一次count++一次
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人