蓝桥杯——卡片(2021省赛C语言全解析!)

小蓝有很多数字卡片,每张卡片上都是数字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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值