第14届蓝桥杯大赛——真题训练第一天

目录

第一题【最小数】

题目描述:请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。请将这个数的十进制形式作为答案提交。

第二题【门牌制作】

题目描述

第三题【货物摆放】

题目描述

常规思路 三层for循环,数字太大计算时间太久

另一种思路


第一题【最小数】

题目描述:

请找到一个大于 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);
     }
 }
 ​

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DaoJis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值