解题思路:按照常规思路三层for循环,肯定是要超时的,必须得做相应优化。我们知道,三个数相乘得到的数,肯定是这三个数的倍数,也就是说,这三个数都是它的因子。我们试图先找到num的所有因子,然后再在所有因子中找所有满足相乘为num的组合,这样就能大大降低复杂度。
代码如下:
public class Main {
public static void main(String[] args) {
//先找出num的所有因子,放入ArrayList数组
ArrayList<Long> arr = new ArrayList<>();
long num = 2021041820210418l;
for ( long i = 1 ; i <= Math.sqrt(num) ; i++ ){//遍历到num平方根即可
if ( num % i == 0 ){//如果i是其中一个因子
arr.add(i);
long n = num / i;//找出另一个和i相乘为num的因子
if ( n != i ){//避免两个因子重复
arr.add(n);
}
}
}
int size = arr.size();
int count = 0;
for (long i : arr){//三层循环
for (long j : arr){
for (long k : arr){
if (i*j*k == num) count++;
}
}
}
System.out.println(count);
}
}