C语言程序设计练习Day3|门牌制作and卡片

前言

今天做的这两道题都比较简单,还看了一道动态规划的,但是只学会了思路具体的代码还未实现出来。

门牌制作

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,不过找到了就理解了。

总结

明天努力学动态规划!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值