飞道的博客

蓝桥杯入门即劝退(二十三)货物摆放问题

648人阅读  评论(0)

欢迎===关注===点赞===评论,共同学习,共同进步!

------持续更新蓝桥杯入门系列算法实例--------

如果你也喜欢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

 三、代码实现


  
  1. public static void main (String[] args) {
  2. Long n= new Long( "2021041820210418"); //创建Long型,注意是字符串形式
  3. int count= 0;
  4. ArrayList<Long> res= new ArrayList();
  5. for ( long i= 1;i<Math.sqrt(n);i++){
  6. if (n%i== 0) {
  7. res.add(i); //添加一个因数
  8. if (n/i!=i) //非重复即再次添加
  9. res.add(n/i);
  10. }
  11. }
  12. for ( long i:res)
  13. for ( long k:res)
  14. for ( long m:res)
  15. {
  16. if (i*k*m==n)
  17. count++;
  18. }
  19. System.out.print(count);
  20. }

发文不易,恳请大佬们高抬贵手!


点赞:随手点赞是种美德,是大佬们对于本人创作的认可!


评论:往来无白丁,是你我交流的的开始!


收藏:愿君多采撷,是大佬们对在下的赞赏!


转载:https://blog.csdn.net/m0_55278347/article/details/129251211
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场