欢迎===关注===点赞===评论,共同学习,共同进步!
------持续更新蓝桥杯入门系列算法实例--------
如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!
你的点赞、关注、评论、是我创作的动力!
-------希望我的文章对你有所帮助--------
专栏:蓝桥杯入门系列
一、题目描述
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 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 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
二、解题思路
1、由于给出的数字已经超出了int的最大范围,因此选择使用Long整型。
2、按题意无非就是求该数字的非重复的三个因数。
3、如果使用暴力解法,运行会报错,因此必须缩小范围。
4、缩小范围可以对n进行开平方,使用sqrt()方法。
5、将n的因数存储进一个列表中。
5、再次取商获得下一个因数,如:15/3=5,那么3、5都是其因数;且不能是重复的,如9/3=3,这里两个数如果都add则是重复了,因此要考虑去掉后者。
6、最后一个三重循环求解即可。
7、最后答案2430
三、代码实现
-
public
static
void
main
(String[] args) {
-
Long n=
new
Long(
"2021041820210418");
//创建Long型,注意是字符串形式
-
int count=
0;
-
ArrayList<Long> res=
new
ArrayList();
-
for (
long i=
1;i<Math.sqrt(n);i++){
-
if (n%i==
0) {
-
res.add(i);
//添加一个因数
-
if (n/i!=i)
//非重复即再次添加
-
res.add(n/i);
-
}
-
}
-
for (
long i:res)
-
for (
long k:res)
-
for (
long m:res)
-
{
-
if (i*k*m==n)
-
count++;
-
}
-
-
System.out.print(count);
-
-
-
-
}
发文不易,恳请大佬们高抬贵手!
点赞:随手点赞是种美德,是大佬们对于本人创作的认可!
评论:往来无白丁,是你我交流的的开始!
收藏:愿君多采撷,是大佬们对在下的赞赏!
转载:https://blog.csdn.net/m0_55278347/article/details/129251211