问题描述:小兰有很多数字卡片,每张卡片上都是数字0~9。
小兰,准备用这些卡片拼一些数。她想从1开始拼出正整数,每拼一个就保存起来,卡片就不能再用来拼其他数了。
小兰想知道自己能从1拼到多少。
例如,若小兰有30张卡片,其中0~9张各3张,则小兰可以拼出1~10,但是在拼11时,卡片1已经有一张了,因此不能拼出11。
现在小兰手里有0~9的卡片各2021张,共20210张卡片,请问小兰可以从1拼到多少?
分析:求解本题应首先定义一个长度为10的数组,用来存放数字0~9的卡片数,下标代表数字,元素代表卡片已经使用的张数,初始值为0,每种类型的卡片如果使用超过2021张,则输出结果。
程序从1开始递增遍历,当遍历到某个数时,将拼成该数所需的所有卡片类型数增加,随后判断数组中每种卡片是否被用完,如果用完则退出循环。
C语言程序:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a[10] = {0,0,0,0,0,0,0,0,0,0};
for (int s=1;; s++)
{
int temp = s;
while (temp)
{
a[temp % 10]++;
temp /= 10;
}
for (int i = 0; i < 10; i++)
{
if (a[i] > 2021)
{
printf("%d", s-1 );
return 0;
}
}
}
}
C++程序:
#include<iostream>
using namespace std;
int a[10];
int main()
{
for(int s=1;;s++)
{
int temp=s;
while(temp)
{
a[temp%10]++;
temp/=10;
}
for(int i=0;i<10;i++)
{
if(a[i]>2021)
{
cout<<s-1<<endl;//减1是因为这一张无法凑出
return 0;
}
}
}
}
此题难度不算太高,自己手动调试一下完全能够弄懂!