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