目录
题目:
题目描述:

题目链接:
思路:
思路详解:
由题给出0到9的卡片个2021张,后续拼数不成功的情况其实就是某个数字的卡片数量不够。所以我们可以先打表记录0到9的卡片的剩余数量(即int a[10],索引就代表卡片上的数字)。我先自己定义了一个索引ans表示当前在拼的数,ans从1开始。下面就是正式模拟题意过程,先写一个while(1)的无限循环,每次用临时变量temp记录此时ans的值。先假设目前这个数是拼的出来的,然后把temp逐位拆解,每次拆出来一位数就把数组a中记录的相应卡片数-1.在把temp全部拆解完之后,遍历a数组看是否存在某个数字的卡片<0,只要存在一个数字的卡片<0就表明目前这个ans拼不出来同时标记为false。在循环的最后,判断flag是true还是false,如果是true就ans++继续拼下一个数,如果是false,就直接break退出循环
这里还是有一个小细节要注意,退出时的ans是第一个拼不出来的数,题目问最大能拼到哪个数,所以正确答案是ans-1,填空题还是要注意细节,答案错了就直接没分了
代码:
代码详解:
#include<bits/stdc++.h> //填空题,正确答案是3181,题目逻辑不是很难但是细节问题还是容易出错
using namespace std; //这题我一开始没注意细节输出的是3182就错了
int main()
{
int ans=1; //ans表示的是当前在拼的数
int a[10]={2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};
while(1)
{
int temp=ans; //ans表示的是当前在拼的数,用临时变量temp来存
while(temp!=0) //temp!=0表示temp还没有被完全删完,这个while过程表示把temp的每一位拆出来
{
a[temp%10]--; //把当前temp的最后一位的卡片数减1
temp/=10; //删去temp的最后一位
}
bool flag=true; //先标记这个ans能拼出来
for(int i=0;i<10;i++) //遍历所有数字的卡片数
{
if(a[i]<0) //如果拼完ans这个数存在某个卡片数<0,说明ans拼不出来
{
flag=false; //标记这个ans拼不出来
break; //只要存在一个卡片数<0就拼不出来,直接退出
}
}
if(flag==true) //如果能拼出来就尝试下一个数,即ans++
{
ans++;
}
else //如果拼不出来就直接break退出
{
break;
}
}
cout<<ans-1<<endl; //注意:退出时的ans是第一个拼不出来的数,题目问最大能拼到哪个数
//所以正确答案是ans-1,填空题还是要注意细节,答案错了就直接没分了
return 0;
}