1.题目描述
现在,小蓝有 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位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题
2.思路
暴力求解
长宽高分别为a,b,c
先给n(结果),我们要先算出n的因数(n%a=0&&n%b==0&&n%c=0)
然后用三重for循环遍历,使得abc=n
再用一个cnt 计数器计数解法的个数
3.代码实现
package 蓝桥杯;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class 货物摆放 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
int a,b,c;
long n=sc.nextLong();
int cnt=0;
List<Long> list=new ArrayList<>();
//根号n能降低时间复杂度
for(long i=1;i<=Math.sqrt(n);i++)
{
if(n%i==0)//找到n的因子
list.add(i);//把因子添加到链表上
if(i != n / i)
{
list.add(n / i);
}
// /*
// * else { list.add(n/i);//除不尽,非因子 }
// */
}
for(int i=0;i<list.size();i++)
{
for(int j=0;j<list.size();j++)
{
if(list.get(i) * list.get(j) > n)
{
continue;//跳过,如果i*j>n 则i*j*k>n 降低时间复杂度
}
for(int k=0;k<list.size();k++)
{
if(list.get(i)*list.get(j)*list.get(k)==n)
cnt++;
}
}
}
System.out.println(cnt);
}
}
4.答案