小蓝有很多数字卡片,每张卡片上都是数字0 到9。
小蓝准备用这些卡片来拼一些数,他想从1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从1 拼到多少。
例如,当小蓝有30 张卡片,其中0 到9 各3 张,则小蓝可以拼出1 到10,但是拼11 时卡片1 已经只有一张了,不够拼出11。
现在小蓝手里有0 到9 的卡片各2021 张,共20210 张,请问小蓝可以从1拼到多少?
提示:建议使用计算机编程解决问题。
思路:采用数字模拟+枚举,把数字全部列举出来,再消耗卡片数量,直到卡片被消耗完就结束
例如:从0开始到最后一个数字,一个数字就挨个比较,并比较即可。
概括:
//初始化一个长度为10的数组a,用来记录每个数字0到9的卡片数量。
//每个数字卡片的初始数量设为2021。
//使用一个无限循环for(int i=0;;i++),从数字0开始逐次尝试拼出每个数字。
//i表示当前尝试拼出的数字。
// int x = i; 将当前数字i复制给x,以便在后续过程中通过x的变化来处理每个数字的每位。
//用while循环处理数字x的每一位:
//x % 10得到x的最低位数字(即个位)。
//if (a[x % 10] == 0)检查能否使用一张相应位数字的卡片:
//如果卡片用完(数量为0),则输出i - 1并退出程序(return 0;)。
//这时i - 1是最后一个可以成功拼出的数字。
//若卡片未用完(a[x % 10] 非0),则减少对应数字卡片数量(a[x % 10]--)。
//用x /= 10; 删除处理过的最低位,继续下一个高位。
#include<stdio.h>
int main() {
//初始化一个长度为10的数组a,用来记录每个数字0到9的卡片数量。
//每个数字卡片的初始数量设为2021。
int a[10];
for (int i = 0; i <= 9; i++) {
a[i] = 2021;
}
//使用一个无限循环for(int i=0;;i++),从数字0开始逐次尝试拼出每个数字。
//i表示当前尝试拼出的数字。
// int x = i; 将当前数字i复制给x,以便在后续过程中通过x的变化来处理每个数字的每位。
//用while循环处理数字x的每一位:
//x % 10得到x的最低位数字(即个位)。
//if (a[x % 10] == 0)检查能否使用一张相应位数字的卡片:
//如果卡片用完(数量为0),则输出i - 1并退出程序(return 0;)。
//这时i - 1是最后一个可以成功拼出的数字。
//若卡片未用完(a[x % 10] 非0),则减少对应数字卡片数量(a[x % 10]--)。
//用x /= 10; 删除处理过的最低位,继续下一个高位。
int x;
for (int i = 0;; i++) {
int x = i;
while (x) {
if (a[x % 10] == 0) {
printf("%d", i - 1);
return 0;
}
a[x%10]--;
x /= 10;
}
}
return 0;
}
&spm=1001.2101.3001.5002&articleId=143330254&d=1&t=3&u=e288829e9108480894b2e35e1e69e3c5)
2万+

被折叠的 条评论
为什么被折叠?



