前言
今天做的这两道题都比较简单,还看了一道动态规划的,但是只学会了思路具体的代码还未实现出来。
门牌制作
1.题目
题目描述
小蓝要为一条街的住户制作门牌号。这条街一共有2020 位住户,门牌号从 1到2020 编号。
小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017 需要依次粘贴字符
1、0、1、7,即需要1 个字符0,2 个字符1,1个字符7。
请问要制作所有的1到2020号门牌,总共需要多少个字符2?
2.C语言代码
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int n=2020;
int i,temp,number;
int count=0;
for(i=1; i<=n; i++)
{
temp=i;
while(temp!=0)
{
number=temp%10;
if(number==2)
count++;
temp=temp/10;
}
}
printf("%d",count);
return 0;
}
还是通过暴力枚举法,从1-2020,枚举并计算里面所需要的2字符。
卡片
1.题目
题目描述
小蓝有很多数字卡片,每张卡片上都是数字0到9。小蓝准备用这些卡片来拼—些数,他想从1开始拼出正整数,每拼—个,就保存起来,卡片就不能用来拼其它数了。
小蓝想知道自己能从1拼到多少。
例如,当小蓝有30张卡片,其中0到9各3张,则小蓝可以拼出1到10,但是拼11时卡片1已经只有一张了,不够拼出11。
现在小蓝手里有0到9的卡片各2021张,共20210张,请问小蓝可以从1拼到多少?
2.C语言代码
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int number,flag=0,temp,a=0;
int Card[10]= {2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};
for(number=1; ; number++)
{
temp=number;
while(temp!=0)
{
a=temp%10;
if(Card[a]==0)
{
flag=1;
break;
}
Card[a]--;
temp=temp/10;
}
if(flag==1)
break;
}
printf("%d",number-1);
return 0;
}
对输入进来的number进行组成检测,对其每个字符数字进行检测,查看Card数组里面这个字符是否还有剩余,如果没有剩余就退出循环。
这里用了两个循环,一个是外层循环,进行number的++,一个是内层循环,主要是对每个number的组成数字进行检测,看数组里面还有没有剩余的字符可以供使用。
3.思考
对于内层循环结束后,还有一个当flag==1时要break,因为flag为1时,内层循环直接结束了,同时外层循环也应该结束,这时候直接设置break,如果在循环结束条件的地方写flag!=0的话,哪怕flag已经变成1了,但此时外循环还要运行完这一次,所以还会再执行一次number++操作。
如果要在for循环条件写flag!=0不在外层循环里写break的话打印number的时候就需要number-2,一次是内层break后,外层的此轮还没停,又执行了一次number++操作,一次是传入的这个检测number是没有被完整满足的,所以是无法被拼成的,只能拼到number的前一个数。
两个操作都差不多,主要是理解就好,当时在这里出现了一点问题,找了一会儿bug,不过找到了就理解了。
总结
明天努力学动态规划!!!