蓝桥杯题解(Java):卡片

文章描述了一个编程问题,小蓝有若干数字卡片,试图用它们从1开始拼出连续的正整数。给定每种数字卡片的数量,目标是确定能拼到的最大数。文章提到了使用数组记录卡片数量,通过循环和取模运算剥离数字,并用布尔标志控制循环结束条件。
摘要由CSDN通过智能技术生成
【真题练习】卡片
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。

小蓝准备用这些卡片来拼一些数,他想从 11 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 拼到多少。

例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,
但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?

提示:建议使用计算机编程解决问题。
运行限制
最大运行时间:1s
最大运行内存: 128M

package lian.xi;

public class Card {
    public static void main(String[] args) {
        int[] arr=new int[10];//用来记录0~9十个数的个数
        int a;//用来表示每次拼成的数
        int temp;//用来对拼成的数进行拆分操作
        int t;//用来存储拆分后的个位数,循环的中止条件一定是个位数最先触发,所以一旦个位数没了排列就结束了
        boolean flag=false;
        for(a=0;a<10;a++) {
            arr[a]=2021;
        }
        for(a=1;;a++) {//从一开始计数最后返回a-1的值,因为最后判断有误这个数不能算
            temp=a;
            while(temp!=0) {//temp=0时说明每位都已经分析完了
                t=temp%10;
                if(arr[t]<=0) {//为什么不是小于0,因为识别出等于零时就不能进行减一操作了,故跳出循环
                    flag=true;
                    break;
                }
                arr[t]--;//上面识别出,这个数用了进行减一操作
                temp/=10;//与上面取余操作配合,实现逐位拆分,对每次的个位进行分析
            }
            if(flag) {//当跳出内层循环后需要立即跳出外层循环就用flag
                break;
            }
        }
        System.out.println(a-1);
    }
}

【总结】

1.记录次数的方法,用for循环的自增来计数。

如果这个题不是一遇到不满足的就停应该就不能,用这个方法计数了吧?

有时我们会用count来计数。

2.进行数字的剥离,运用的是循环,本题运用while循环,通过对一个数的取余和取模操作相配合,让每个数暴露出来,每次都对末尾数字进行识别,循环中止条件是取模后的值为0,所以只要取模后值为零就不在进入循环所以while后的条件是temp!=0。

2.跳出内层循环后需要立即跳出外层循环,设置一个boolean型变量作为信号。

3.用数组可以来记录已知数的个数,下标表示这个数是几,对这个数的个数进行减一操作,也是利用下标。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值