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

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

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

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



    }

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


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


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


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

猜你喜欢

转载自blog.csdn.net/m0_55278347/article/details/129251211