【真题练习】卡片
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有很多数字卡片,每张卡片上都是数字 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.用数组可以来记录已知数的个数,下标表示这个数是几,对这个数的个数进行减一操作,也是利用下标。