显示屏输出(计蒜客)

(复制出错,格式有问题。不要描述部分了,看输入样例就能理解题意)

输入格式

输入两个整数 k,n(1k10,0n99999999),分别表达放大的倍数和需要输出的数字。

输出格式

输出数码管显示的数字,数字每一位之间用一列空格隔开。

样例输入1
2 12345
样例输出1
     --   --        --
  |    |    | |  | |
  |    |    | |  | |
     --   --   --   --
  | |       |    |    |
  | |       |    |    |
     --   --        --
样例输入2
3 67890
样例输出2
 ---   ---   ---   ---   ---
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
 ---         ---   ---
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
 ---         ---   ---   ---

#include <cstdio>
#include <string>
/*
 * 刚开始看的时候一脸蒙,看着看着就看不下去了,断断续续看了一天才看懂。看懂后感觉其实也没那么难。坚持看,不断思考,迟早会懂的。
 * 结合题目,思考自己的解决思路,如果思路跟代码算法一样的话,有助于理解代码。理解够了,实践能力迟早能跟上。
 * */

int num[10][5] = {//用于判断,输出0-9的形状
    {1, 3, 0, 3, 1},
    {0, 1, 0, 1, 0},
    {1, 1, 1, 2, 1},
    {1, 1, 1, 1, 1},
    {0, 3, 1, 1, 0},
    {1, 2, 1, 1, 1},
    {1, 2, 1, 3, 1},
    {1, 1, 0, 1, 0},
    {1, 3, 1, 3, 1},
    {1, 3, 1, 1, 1}
};

using namespace std;

void print(int n, int k, int layer) {//8 2 0
    if(layer % 2 == 0) {//通过观察发现,当倍数为1时,第0,2,4行只有" "和"-"。
        printf(" ");
        for(int i = 0;i < k;++ i) {//横向放大
            if(num[n][layer]) {
                printf("-");
            } else {
                printf(" ");
            }
        }
        printf(" ");
    } else {//3=2+1,矩阵中的3是这样来的,7也行,随你喜欢。一个3就可以判断出当前数字该行的两端应该输出什么,非常精妙的设计,看了好久才看懂。
        if(num[n][layer] & 2) printf("|");
        else printf(" ");
        for(int i = 0;i < k;++ i) {//横向放大
            printf(" ");
        }
        if(num[n][layer] & 1) printf("|");
        else printf(" ");
    }
}

int main() {
    int k, n, len = 0;
    int num[10];
    scanf("%d%d", &k, &n);
    if(n == 0) num[len ++] = 0;
    else while(n) {//分解数字
        num[len ++] = n % 10;//压入栈
        n /= 10;
    }
    for(int layer = 0;layer < 5;++ layer) {
        if(layer % 2 == 1) {
            for(int j = 1;j < k;++ j) {//垂直方向放大
                for(int i = len - 1;i >= 0;-- i) {
                    print(num[i], k, layer);
                    if(i) printf(" ");//分隔两个数字
                }
                printf("\n");//换行输出
            }
        }
        for(int i = len - 1;i >= 0;-- i) {
            print(num[i], k, layer);//因为是栈,要倒着取
            if(i) printf(" ");//分隔两个数字
        }
        printf("\n");//换层输出
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值