hdu 2772 Matchsticks(模拟题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2772

题目大意: 用火柴拼出0到9的数字:

                   

                    数字: 1    2    3    4    5    6    7    8    9    0

                火柴数: 2    5    5    4    5    6    3    7    6    6

                 给出n条火柴,问能够拼出的数字中最小和最大分别是多少? 

解题思路: 简单的模拟题(由于数字太大,打表不了):

                  1.拼出的数字最小,就要使用 需要火柴数较多 的数字,使得这串数字总位数最小;

                  2.拼出的数字最大,则使用 需要火柴数较少 的数字,使得这串数字总位数最大:

                     看数字7和数字1,他们所需的火柴数最小,并且2和3相差1,可以凑成任意的n (n>=2) ;

                  把n=22之前的都打印出来就可以很容易的找到规律了:

                   n=2 1 1
                   n=3 7 7
                   n=4 4 11
                   n=5 2 71
                   n=6 6 111
                   n=7 8 711
                   n=8 10 1111
                   n=9 18 7111
                   n=10 22 11111
                   n=11 20 71111
                   n=12 28 111111
                   n=13 68 711111
                   n=14 88 1111111
                   n=15 108 7111111
                   n=16 188 11111111
                   n=17 200 71111111
                   n=18 208 111111111
                   n=19 288 711111111
                   n=20 688 1111111111
                   n=21 888 7111111111
                   n=22 1088 11111111111
                   n=23 1888 71111111111
                   n=24 2008 111111111111
                   n=25 2088 711111111111
                   n=26 2888 1111111111111
                   n=27 6888 7111111111111
                   n=28 8888 11111111111111
                   n=29 10888 71111111111111
                   n=30 18888 111111111111111
                   n=31 20088 711111111111111
                   n=32 20888 1111111111111111
                   n=33 28888 7111111111111111
                   n=34 68888 11111111111111111
                   n=35 88888 71111111111111111
                   n=36 108888 111111111111111111
                   n=37 188888 711111111111111111
                   n=38 200888 1111111111111111111
                   n=39 208888 7111111111111111111
                   n=40 288888 11111111111111111111
                   n=41 688888 71111111111111111111
                   n=42 888888 111111111111111111111

         最小的数:

                从15开始周期T=7,每个元素分别是108  188  200  208  288  688  888,每加一个周期多一个8;

         最大的数:

                从2开始 周期T=2,每个元素分别是1 7,每加一个周期多一个1;

代码:

#include <stdio.h>
int main()
{
    int t,n,m,i,j,temp,bs1,ys1,bs2,ys2;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        if(n<=1)
            return 0;
        if(n==2)
            printf("1 1\n");
        else if(n==3)
            printf("7 7\n");
        else if(n==4)
            printf("4 11\n");
        else if(n==5)
            printf("2 71\n");
        else if(n==6)
            printf("6 111\n");
        else if(n==7)
            printf("8 711\n");
        else if(n==8)
            printf("10 1111\n");
        else if(n==9)
            printf("18 7111\n");
        else if(n==10)
            printf("22 11111\n");
        else if(n==11)
            printf("20 71111\n");
        else if(n==12)
            printf("28 111111\n");
        else if(n==13)
            printf("68 711111\n");
        else if(n==14)
            printf("88 1111111\n");
        else
        {
            bs1=(n-15)/7;   //最大数的周期数
            ys1=(n-14)%7;   //最大数的周期中第几个元素
            if(ys1==1)
                printf("108");
            else if(ys1==2)
                printf("188");
            else if(ys1==3)
                printf("200");
            else if(ys1==4)
                printf("208");
            else if(ys1==5)
                printf("288");
            else if(ys1==6)
                printf("688");
            else if(ys1==0)
                printf("888");
            if(bs1!=0)
            while(bs1--)     //每加一个周期数多一个8
                printf("8");
            bs2=(n-2)/2;    //最小数的周期数
            ys2=n%2;        //最小数的周期中第几个元素
            printf(" ");
            if(ys2==0)
                printf("1");
            else
                printf("7");
            while(bs2--)     //梅加一个周期数多一个1
                printf("1");
            printf("\n");
        }
    }
    return 0;
}

注:原创文章,转载请注明出处

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值