一、题目
卡片
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0到 9的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少? 提示:建议使用计算机编程解决问题。
二、分析
思路:
定义一个数组,可以存每种牌的数量,然后从1遍历到100000,可以遍历出某种数的话,将那个数的数量减一同时计数器加一,最后哪种牌如果不够用的话,我们直接退出循环。
但是我写到如何比较当前遍历的i 与要拼的数字相等时我就卡住了,接下来我就看看别人的代码蓝桥杯题解(Java):卡片_java画出填空题题答题卡-CSDN博客
看了被人的代码后我知道了,我们不需要 比较当前遍历的i 与要拼的数字相等,而是把当前的i作为要拼的数字,内层循环再遍历得到每一次的个位,个位数所对应数组中的值若已经为0(表示当前数组已经没有这个数),我们结束内外循环,输出拼的数量,若不为0,表示我们要用当前的数字,我们把数字的个数减一。
同时也外层循环不需要遍历1到100000,而是无限的循环,直到我们不满足条件时候break跳出即可。也不需要计数器,我们需要找到的是最大数字,不需要计数,读题要细心
代码:
package lan2021;public class B卡片 {public static void main(String[] args) {//定义一个数组int[] a = new int[10];for(int j = 0; j < 10; j++) a[j] = 2021;int i;int ge;int temp;boolean flag = true;for(i= 1;; i++) {temp = i;//先要得到这个数while(temp != 0) {ge = temp % 10;if(a[ge] <= 0) {//得到个位后我们要对个位进行判定如果数组中所对应的数的个数为0//break;因为当前的break只能跳出内循环,哦们需要的是在拼成数字的时候结束整个循环,及就是也不往后找了,这时候我们聚就需要设置一个 标记(是否找到要拼的数字)flag = false;break;}a[ge]--;//如果数组中有这个数//表示使用了这个数后,数组中所对应的个数减一temp /= 10;//去掉刚才判断过的个位数}//判断flag是否为false,若为false,也跳出外循环if(flag == false) break;}System.out.println(i-1);}
}
输出结果:
3181
反思:(感兴趣的可以看看)
在写的过程中遇到了问题,一个是内层循环的后括号没写,可能是因为注释代码(我把注释都加在每行的末尾了)加上我没看清的原因,还有以一个问题就是我忘记在内循循环之前把当前的这个数保存(设置temp),直接对i进行取余和去掉各位(i一直在被更新)的时候不能达到相应的效果(得到每一位数),致使我内层循环的退出条件是i <=0,其实是temp<=0,找的好辛苦