问题描述:小兰有很多数字卡片,每张卡片上都是数字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;}}}
}
此题难度不算太高,自己手动调试一下完全能够弄懂!