蓝桥杯真题:卡片

小蓝有很多数字卡片,每张卡片上都是数字 00 到 99。

小蓝准备用这些卡片来拼一些数,他想从 11 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从 11 拼到多少。

例如,当小蓝有 3030 张卡片,其中 00 到 99 各 33 张,则小蓝可以拼出 11 到 1010,

但是拼 1111 时卡片 11 已经只有一张了,不够拼出 1111。

现在小蓝手里有 00 到 99 的卡片各 20212021 张,共 2021020210 张,请问小蓝可以从 11 拼到多少?


//此方法来自某位大佬的题解!
#include <iostream>
using namespace std;
int main()
{
	int s[10] = { 2021,2021,2021,2021,2021,2021,2021,2021,2021,2021 };
	int x;
	int i;
	for (i = 1;  ; i++)
	{	
		x = i;//用x来存放i的值,防止其改变

		for (; x != 0;)//因为后面用了x/10,所以在x为0之前都要计算出其个位数并将相应的卡片数-1
		{
			if (s[x % 10] == 0)//若卡片已经为0,说明这个数已经无法拼出,所以输出前一个数
			{
				cout << i - 1 << endl;
				exit(0);//下面会讲到exit(0)
			}
			s[x % 10]--;
			x /= 10;
		}
	}
	return 0;
}

为什么用exit(0)而不用break;/continue;?

braek:跳出本层循环,执行本层循环下面的语句。
continue:终止本次循环,进入下一次循环。

goto:调到标号所在位置,执行标号下面的语句,它比较方便的是可以一次跳出多重循环,但是它只能在函数内跳转,不能在函数间跳转。

return():返回函数,若在主函数中,则会退出函数并返回一值。

exit(1):非正常运行导致退出程序;

exit(0):正常运行程序并退出程序;

这里有好几重循环,找到i-1后应退出所有循环,终止程序

使用break仅能退出if循环,会输出很多个数!

这里再说一下goto函数的格式:

#include <iostream>
using namespace std;
int main()
{
	int s[10] = { 2021,2021,2021,2021,2021,2021,2021,2021,2021,2021 };
	int x;
	int i;
	for (i = 1;  ; i++)
	{	
		x = i;

		for (; x != 0;)
		{
			if (s[x % 10] == 0)
			{
				cout << i - 1 << endl;
				goto logo;
			}
			s[x % 10]--;
			x /= 10;
		}
	}
	logo:
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值