解题思路:卡片1最先用完,数字从1开始拼,将2021个1耗尽为止。
每一位数的取法:
(1)i%10能取出该1数字的最低位。
(2)接着将i/10,循环上一步取出高一位数字。如此循环,直至i/10==0取最后一位,结束循环。
程序如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int numone=2021;//2021张1,因此控制循环次数
int k,i=0;//i记录拼接到数字
while(numone)
{
i++;
k=i;//k用于存放数字i,方便计算拼接该数字需要用到的1
while(k)
{
if(k/10==0)//k/10==0表示已经是个位了
{
if(k%10==1)//是否消耗数字1
{
if(numone>0)
/*该判断一定要加上,如果一个数字拼接中多次使用1,可能会让numone小于0致使陷入死循环*/
numone--;
else
i--;
/*该步骤是如果在拼接最低位时已经没有1了,则该数字不能拼接能拼接的数需要减1。
可以将numone设置为3,理论上只能拼接到10,去掉该步骤则会显示11 */
}
}
else
{
if(k%10==1)
{
if(numone>0)
numone--;
}
}
k=k/10;//取下一位
}
}
printf("%d",i);
return 0;
}