时间:2022-2-27 作者:老大夫 分类: 《蓝桥杯省赛真题解析》2021 年第十二届 C++ B组
转载自:https://www.lanqiao.cn/courses/5485
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题
运行限制
最大运行时间:1s
最大运行内存: 128M
解题思路
比较容易的模拟,我们从 1 开始枚举, 每次检查剩下的卡片能不能拼出这个数字就好。
我们是怎么把一个数在 10 进制下每个位置的数字求出来呢?很简单对吧,先 对 10 取模,个位上的数字就求出来了,再除以 10 ,原本十位上的数字就变到了个位上,再对 10 取模...依次进行下去就求出来了。把当前拼的这个数每一位都拆出来,看看那个数字的卡片还够不够,不够的话就说明拼不了,这时候退出循环,所以最多拼到上一个数。
最终答案:3181。
#include<bits/stdc++.h>
using namespace std;
//存放卡片的数组
int num[10];
int main(){
//每个数字存量2021张
for(int i=0;i<=9;i++){
num[i]=2021;
}
// 从1开始拼数字
for(int i=1;true;i++){
// 设置一个临时temp变量
int temp=i;
// 该数字完全拼出后结束该数字的循环
while(temp){
//先从每个数字的个位开始拼
num[temp%10]--;
//如果哪一种数字卡片用光了就停止程序,输出最后在拼接的数字
if(num[temp%10]==0){
cout << i;
return 0;
}
temp/=10;
}
}
}
推荐阅读:
行动消除疑虑