目录
题目描述:请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。请将这个数的十进制形式作为答案提交。
第一题【最小数】
题目描述:
请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。请将这个数的十进制形式作为答案提交。
public class LQ_最小数 {
public static void main(String[] args) {
for (int i = 2022; ; i++) {
Boolean flag = true;
char[] chars = Integer.toString(i, 16).toCharArray();
for (int j = 0; j < chars.length; j++) {
if (chars[j] < 'a' || chars[j] > 'f') {
flag = false;
break;
}
}
if (flag){
System.out.println(i);
break;
}
}
}
}
第二题【门牌制作】
题目描述:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符
public class 门牌制作 {
public static void main(String[] args) {
int[] menPaiHao = new int[10];
for (int i = 1; i <= 2020; i++) {
String s = i + "";
char[] chars = s.toCharArray();
for (int j = 0; j <chars.length ; j++) {
int b = chars[j] -'0';
menPaiHao[b]++;
}
}
System.out.println(menPaiHao[2]);
}
}
第三题【货物摆放】
题目描述:
小蓝有一个超大的仓库,可以摆放很多货物。
现在,小蓝有 n 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物的边都必须严格平行于长、宽、高。
小蓝希望所有的货物最终摆成一个大的长方体。即在长、宽、高的方向上分别堆 L、W、H 的货物,满足 n=L×W×H。
给定 nn,请问有多少种堆放货物的方案满足要求。
例如,当 n=4 时,有以下 6 种方案:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1
请问,当 n=2021041820210418 (注意有 16 位数字)时,总共有多少种方案?
提示:建议使用计算机编程解决问题。
常规思路 三层for循环,数字太大计算时间太久
另一种思路
三个数相乘要等于n,那么这三个数是不是都是n的因子,都能被n整除呢?
上方的算法,三层for循环都是从1遍历到n,其中很多组合都是无效的
简而言之,这些无效组合中不能同时被n整除,而有效的组合,任何一个数都能被n整除
所以,如果我们能从n的因子里面去找组合,是不是时间复杂度就要小许多?
long n= 2021041820210418l; //如果直接赋值,计算机默认数字是int类型,会报错。所以要在后面加'l',转换为long类型
import java.util.ArrayList;
public class 货物摆放_long {
public static void main(String[] args) {
long count = 0l;
//定义一个ArrayList数组,存放n的因子
ArrayList<Long> list = new ArrayList<Long>();
long n = 2021041820210418l;
//从1开始遍历,遍历到n的平方根结束。不需要把n遍历一遍,这样算法复杂都也非常大,重点看for循环里面的语句
for (long i = 1; i < (long) Math.sqrt(n); i++) {
if (n % i == 0) {//如果能被整除,就放到list数组中
list.add(i);
//!!!重点在这里,当i能被num整除的情况下,求出num关于i的另外一个除数n
//这样,for循环不需要从1遍历到num。可以通过较小的因子,求出另外一个较大的因子
long num = n / i;
//如果num = Math.sqrt(num)*Math.sqrt(num),那么由较小的因子求较大的因子时,会重复,要排除这种情况
if (i!=num){
list.add(num);//将较大的因子放入arr数组
}
}
}
System.out.println("共有因子" + list.size());
for (Long aLong : list) {
for (Long aLong1 : list) {
for (Long aLong2 : list) {
if (aLong * aLong1 * aLong2 == n) {
count++;
}
}
}
}
System.out.println(count);
}
}