题目内容:
解题思路: 设置数组a 长度为10,a[n]就代表n这个数的已使用次数,从1开始循环,循环到每个数时,获取其每一位,对每一位进行已使用计数,每次循环结束前进行一次检查,检查有无数超过2021即可,若已经有数超过2021,则说明i-1就是最多能拼出的数字。
源码:(C语言)
#include<stdio.h>
int main()
{
int a[10] = {0};
int i,m,n,k,p,b;
for(i = 1;i < 10000; i++)//注意审题,从1开始拼噢
{
if(i < 10)//如果i是个位数
a[i]++;
if(i >= 10 && i < 100)//如果i是两位数
{
m = i/1%10; //m是个位数
n = i/10%10; //n是十位数
a[m]++;a[n]++;
}
if(i >= 100 && i < 1000)//如果i是三位数
{
m = i/1%10; //m是个位数
n = i/10%10; //n是十位数
k = i/100%10; //k是百位数
a[m]++;a[n]++;a[k]++;
}
if(i >= 1000 && i < 10000)//如果i是四位数
{
m = i/1%10; //m是个位数
n = i/10%10; //n是十位数
k = i/100%10; //k是百位数
p = i/1000%10; //p是千位数
a[m]++;a[n]++;a[k]++;a[p]++;
}
for(b = 0;b < 10;b++)
{
if(a[b] > 2021) //等于2021是正好用完,是可以拼出的,所以要大于
{
printf("只能加到: %d ",i - 1);
return 0;
}
}
}
//答案是3181
最后答案是 3181