题目
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。
小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从 1 拼到多少。
例如,当小蓝有 30 张卡片,其中 0到9各3 张,则小蓝可以拼出 1到 10.
但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
现在小蓝手里有 0到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少?
提示:建议使用计算机编程解决问题。
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
思路
思路很简单,但是很容易最后结果出现一点点偏差。
最容易想到的就是,建立一个数组,下标为0-9,每一位的元素为2021。
写一个检测这个数组有没有0的方法
public static boolean check(int[] arr){
for (int j : arr) {
if (j == 0) {
return false;
}
}
return true;
}
从一开始,遍历,去将每一位数字提取出来,将对应下标的值减去一直到有0出现。
提取每一位的数字可以用用10取模,结果就是末尾的数字,然后除以10就可以变为去除最后一位。
对于小于10的各位数要单独注意一下。
答案
3181
完整代码
public static void main(String[] args) {
int[] arr = {2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021, 2021};
int index = 1;
tip1:
while (true) {
int i = index;
while (i > 0) {
if (i<10){
if (check(arr)){
arr[i]--;
break;
}else {
break tip1;
}
}else {
int level = i % 10;
if (check(arr)) {
arr[level]--;
printArr(arr);
System.out.println();
i = i / 10;
} else {
printArr(arr);
System.out.println();
break tip1;
}
}
}
index++;
}
System.out.println(index);
}
public static void printArr(int[] arr){
for (int j : arr) {
System.out.print(j + " ");
}
}
public static boolean check(int[] arr){
for (int j : arr) {
if (j == 0) {
return false;
}
}
return true;
}