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++一次

posted @   风起鹤归  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示