每日训练(day03.3)

货物摆放icon-default.png?t=N7T8https://www.lanqiao.cn/problems/1463/learning/?page=1&first_category_id=1&sort=students_count&asc=0&difficulty=30小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有n箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高.小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆L、W、H的货物,满足n =Lx W x H。
给定n,请问有多少种堆放货物的方案满足要求。
例如,当n =4时,有以下6种方案: 1×1×4、1×2×2、1x4×1、2× 1×2、2×2×1、4x1×1.请问,当n = 2021041820210418 (注意有16位数字)时,总共有多少种方案?
方法一

import os  
import sys  # 导入os和sys模块,但在这段代码中并没有使用到这两个模块。  
  
# 定义变量n为需要求因子的数  
n=2021041820210418  
  
# 定义一个空列表l,用于存放n的质因数分解中的因数。  
l=[]     # !!!!用于存因数不是因子例如:10=2*5  
  
# 初始化变量i为2,用于遍历n的所有可能的因数。  
i=2  
  
# 初始化变量x为n,用于在while循环中逐个判断i是否是n的因数。  
x=n  
  
# while循环,当i小于sqrt(x+1)时执行循环体。  
while i<pow(x+1,0.5):   # sqrt函数通常使用pow(x, 0.5)来代替,这里是为了保持注释中的格式。  
    # 如果i是x的因数(即x能被i整除),则执行下面的代码块。  
    if x%i==0:  
        # 将i添加到列表l中。  
        l.append(i)  
        # 用i除以x,更新x的值。  
        x=x//i  
    else:  # 如果i不是x的因数,则执行else代码块。  
        # i自增1,尝试下一个可能的因数。  
        i+=1  
# 当while循环结束后,将x添加到列表l中,因为此时x必定是最后一个因数。  
l.append(x)   # 最后一个质因数被添加到列表中。  
  
# 定义一个集合s,用于存放n的所有因子。初始时将1加入集合中。  
s=set()     # !!!!用于存因子 如10=1*2*5*10  
s.add(1)  
  
# 遍历列表l中的每个质因数j。  
for j in l:   # 对于每个质因数j进行以下操作:  
    # 初始化一个空集合p,用于存放j的所有可能的因子乘积。  
    p=set()   # 用于存放当前质因数j的所有因子乘积。  
    # 遍历集合s中的每个元素k。  
    for k in s:   # 对于集合s中的每个元素k进行以下操作:  
        # 将j和k的乘积添加到集合p中。  
        p.add(j*k)   # 将j和k的乘积添加到集合p中。  
    # 将集合p中的所有元素添加到集合s中,以便后续计算。  
    for k in p:   # 对于集合p中的每个元素k进行以下操作:  
        s.add(k)   # 将k添加到集合s中,以便后续计算。  
  
# 初始化变量count为0,用于统计n的因子对的数量。  
count=0     
  
# 遍历集合s中的每个元素k1和k2(注意:这里的k1和k2不是并列关系,应该理解为两层循环)。  
for k1 in s:             # 第一层遍历:遍历两层求解,求解所有可能的因子对k1和k2。  
    for k2 in s:          # 第二层遍历:遍历两层求解,求解所有可能的因子对k1和k2。  
        # 如果k1和k2的乘积能被n整除,则count加1,表示找到了一个因子对。  
        if n%(k1*k2)==0:   # 如果n能被k1和k2的乘积整除,则说明找到了一个因子对。  
            count+=1       # count加1,表示找到了一个因子对。  
  
# 打印count的值,即n的因子对的数量。  
print(count)   # 打印count的值,即n的因子对的数量。每行注释到此结束。

方法二

# 导入math库,它提供了各种数学函数和常数。  
import math  
  
# 初始化变量ans为0,用于存储因子对的数量。  
ans = 0  
  
# 初始化变量n为2021041820210418,这是需要求因子的数。  
n = 2021041820210418  
  
# 初始化一个空列表lst,用于存放n的所有因子。  
lst = []  
  
# 使用for循环遍历从1到n的平方根的所有整数。  
for i in range(1, math.ceil(n**0.5)):  
    # 如果i是n的因数(即n能被i整除),则执行下面的代码块。  
    if (n % i == 0):  
        # 将i添加到列表lst中。  
        lst.append(i)  
        # 如果i不是n的最后一个因数(即n/i不等于i),则执行下面的代码块。  
        if n / i != i:  
            # 将n/i添加到列表lst中。  
            lst.append(n/i)  
  
# 使用三个嵌套的for循环遍历列表lst中的所有元素。  
for i in lst:  
    for j in lst:  
        for k in lst:  
            # 计算三个元素的乘积。  
            if (i*j*k == n):  
                # 如果乘积等于n,则将变量ans加1,表示找到一个因子对。  
                ans += 1  
  
# 打印变量ans的值,即n的因子对的数量。  
print(ans)

暴力解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值