题目描述

小蓝有一个超大的仓库,可以摆放很多货物。

现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。

小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足n=L×W×H。

给定 n,请问有多少种堆放货物的方案满足要求。

例如,当 n=4 时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1.

请问,当n=2021041820210418 (注意有16 位数字)时,总共有多少种方案?

提示:建议使用计算机编程解决问题。

答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

参考代码(超时):

n = 2021041820210418
sum = 0
h_list = [] # 创建一个列表存因数
for i in range(1, int(pow(n, 0.5)) + 1): # 两个因数中小的那个不会超过原数开根号的值
if n % i == 0:
h_list.append(i)
if n / i != i: # 将较大的那个因数也存进列表
h_list.append(n / i)
for i in h_list:
for j in h_list:
for m in h_list:
if (i * j * m) == n: # 通过for循环将列表中的每个数都依次取出比较是否符合条件
sum += 1
print(sum)

点击并拖拽以移动

合规代码:

import os
import sys
n = 2021041820210418
l = [] # 用于存因数
i = 2
x = n
while i < pow(x + 1, 0.5): #
if x % i == 0:
l.append(i)
x = x // i
else:
i += 1
l.append(x)
s = set() # 用于存因子
s.add(1)
for j in l:
p = set()
for k in s:
p.add(j * k)
for k in p:
s.add(k)
count = 0
for k1 in s: # 遍历两层求解
for k2 in s:
if n % (k1 * k2) == 0:
count += 1
print(count)

点击并拖拽以移动

解题思路:

第一个代码是普遍能想到的,即将n的因数找出来,并存到列表中,然后将列表一个一个遍历相乘看是否等于n,若等于则数量加一。但此方法超出了问题所规定的时限

第一个代码:本题是一个长方体的空间,且其边长的每一个单位就相当于一个物品,那么其边长必需是一个整数。也可以理解为是n的因数,就需要找出n的因数。因数一般是两个数字,而其较小的那个一般是小于等于原数开根号的,我们找到小的那个因数存入列表,再判断两个因数是否相同,如不同再将另一个存进列表。

当所有因数都找到后,利用三个for循环嵌套将列表中的数都遍历相乘,找到符合条件的

第二个代码是一个符合题目运行时间的,对于这个代码我也不是很懂,这个代码来自货物摆放 - 蓝桥云课 (lanqiao.cn)

这个网站题解python里面的第一位大神

有理解的可以发在评论区里帮我们学习一下这个代码的实现过程