欢迎===关注===点赞===评论,共同学习,共同进步!
------持续更新蓝桥杯入门系列算法实例--------
如果你也喜欢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);}
发文不易,恳请大佬们高抬贵手!
点赞:随手点赞是种美德,是大佬们对于本人创作的认可!
评论:往来无白丁,是你我交流的的开始!
收藏:愿君多采撷,是大佬们对在下的赞赏!