货物摆放例题——(求n的所有因子+foreach循环+set集合应用)

这里写目录标题

例题引入

题目分析

复制代码
- n个都是 V=1 的小正方体---》去拼成一个大的长方体---》满足n=L×W×H
- 也就是,在小于等于n的所有数中,任取3个数(可重复),这仨数的乘积等于n
- 然后,把这仨数全排列了,加到总方案数上。

解题方法

1.暴力求解

我第一想法就是直接暴力循环,但是n给的太大了

这方法pass掉

java 复制代码
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        //在此输入您的代码...
        //太太太慢了!!!
        long n = 2021041820210418L;
        long count = 0L;
        for(long i=1;i<=2021041820210418L;i++){
          for(long j=1;j<=2021041820210418L;j++){
            for(long k=1;k<=2021041820210418L;k++){
              if(i*j*k == n){
                count += 1;
              }
            }
          }
        }
        System.out.print(count);
   }
}

2.求n的所有的因子

既然暴力循环所有1到n的数不行,那按照题意,这仨数一定是n的因子

==》想到,能不能把所有的因子存到一起,然后只循环这些因子?

需要注意的是:在二分时,有一种特殊情况,使得存值会有个重复的

复制代码
	eg. n=4时
	2*2=4
	如果没有if(x != i) {	//把 n = Math.sqrt(n) * Math.sqrt(n)情况排除掉
    			list.add(x);
    		}
    那list中,就会存两个2---》存值重复
java 复制代码
//先计算出2021041820210418的所有因子--》循环判断这些因子即可
        long n = 2021041820210418L;
        ArrayList<Long> list = new ArrayList<>();
        //二分
        for(Long i=1L; i<=Math.sqrt(n);i++) {
        	//能整除就加到list集合中
        	if(n%i == 0) {
        		list.add(i);
        		
        		//再把大于sqrt(n)的 和i成对的因子也加到list集合中
        		long x = n/i;
        		if(x != i) {	//把 n = Math.sqrt(n) * Math.sqrt(n)情况排除掉
        			list.add(x);
        		}
        	}
        }
        
        //这里发现传统的for循环,写这玩应太麻烦了
        //学了一下foreach,语法在代码下面
        long count = 0L;
        for(long i : list) {
        	for(long j : list) {
        		for(long k : list) {
        			if(i*j*k == n) {
        				count++;
        			}
        		}
        	}
        }
        System.out.println(count);

foreach循环

java 复制代码
for(element_type element : collection){
	//循环体
}
  • element_type就是集合或数组中元素的类型

  • element 表示每次循环迭代时访问的元素

  • collection:表示要遍历的数组或集合

  • 举个例子

    复制代码
      eg. 遍历数组a
      int[] a = new int[n];
      //用for循环就是:
      for(int i=0;i<n;i++){...}
      //用foreach就是:
      for(int i : a){...}
  • foreach的优缺点

    • 【优点】
      • 语法简洁:代码量少啊
      • 避免了索引越界的错误:打代码的时候经常会遇见java.lang.ArrayIndexOutOfBoundsException 这个错误,就是数组越界了。而foreach就避免了这种错误,它会自动处理集合或数组的边界情况。
    • 【缺点】
      • for可以动态修改遍历的范围,foreach不行
      • 无法获取当前元素的索引:for就是利用的这种索引机制,才会有ArrayIndexOutOfBoundsException这个常见的报错。但同时,这也是foreach的缺点,foreach无法直接访问当前元素的索引,需要通过其他方式解决。

3.利用 set集合

既然要单独解决元素重复的问题

那提到重复,就不得不提到Set集合了

它压根不会存重复的元素

java 复制代码
		long n = 2021041820210418L;
        HashSet<Long> set = new HashSet<>();
        for(long i=1L;i<=Math.sqrt(n);i++) {
        	if(n%i == 0) {
        		set.add(i);
        		long x = n/i;
        		set.add(x);
        	}
        }
        
        long count = 0L;
        for(long i : set) {
        	for(long j : set) {
        		for(long k : set) {
        			if(i*j*k == n) {
        				count++;
        			}
        		}
        	}
        }
        System.out.println(count);

参考文章

相关推荐
kyle~几秒前
CPU调度---协程
java·linux·服务器·数据库·c++20
会飞的小蛮猪4 分钟前
Skywalking运维之路(Skywalking服务搭建)
java·运维·监控
L.EscaRC14 分钟前
Redisson在Spring Boot中的高并发应用解析
java·spring boot·后端
他们叫我技术总监16 分钟前
从开发者视角深度评测:ModelEngine 与 AI 开发平台的技术博弈
java·人工智能·dubbo·智能体·modelengine
李辉200320 分钟前
Python逻辑运算符
java·网络·python
摇滚侠33 分钟前
Spring Boot3零基础教程,StreamAPI 介绍,笔记98
java·spring boot·笔记
扫地僧过江南39 分钟前
Kanass零基础学习,如何进行任务管理
java·禅道·项目管理工具
无敌最俊朗@40 分钟前
C++ 值类别与移动语义详解(精简版)
java·数据结构·算法
脸大是真的好~42 分钟前
黑马JAVA+AI 加强14-2 网络编程-UDP和TCP通信-线程和线程池优化通信-BS架构原理
java
金銀銅鐵1 小时前
[Java] 浅析 Map.of(...) 方法和 Map.ofEntries(...) 方法
java·后端