首页 > 试题广场 >

显示器

[编程题]显示器
  • 热度指数:157 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。

输入描述:
输入包含多组数据,每组数据包含两个整数s(1≤s≤10)和n(1≤n≤99999999)。

其中n 是要显示的数,s 是要显示的数的尺寸。


输出描述:
显示的方式是:用 s 个“-”表示一个水平线段,用s 个“|”表示一个垂直线段。这种情况下,每一个数字需要占用s+2 列和2s+3 行。

另外,在两个数字之间要输出一个空白的列。每组数据之后输出一个空行作为分隔。

注意:输出中空白的地方都要用空格来填充。
示例1

输入

2 12345
3 67890

输出

--   --        -- 
   |    |    | |  | |   
   |    |    | |  | |   
      --   --   --   -- 
   | |       |    |    |
   | |       |    |    |
      --   --        -- 

 ---   ---   ---   ---   --- 
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
 ---         ---   ---       
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
 ---         ---   ---   ---
将输出屏幕上的位置映射到最基本3*5区域内的字符的位置,然后逐行打印即可。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
 
charnums[10][5][3] =
{
    {
        {' ','-',' '},
        {'|',' ','|'},
        {' ',' ',' '},
        {'|',' ','|'},
        {' ','-',' '}
    }, // 0
    {
        {' ',' ',' '},
        {' ',' ','|'},
        {' ',' ',' '},
        {' ',' ','|'},
        {' ',' ',' '}
    }, // 1
    {
        {' ','-',' '},
        {' ',' ','|'},
        {' ','-',' '},
        {'|',' ',' '},
        {' ','-',' '}
    }, // 2
    {
        {' ','-',' '},
        {' ',' ','|'},
        {' ','-',' '},
        {' ',' ','|'},
        {' ','-',' '}
    }, // 3
    {
        {' ',' ',' '},
        {'|',' ','|'},
        {' ','-',' '},
        {' ',' ','|'},
        {' ',' ',' '}
    }, // 4
    {
        {' ','-',' '},
        {'|',' ',' '},
        {' ','-',' '},
        {' ',' ','|'},
        {' ','-',' '}
    }, // 5
    {
        {' ','-',' '},
        {'|',' ',' '},
        {' ','-',' '},
        {'|',' ','|'},
        {' ','-',' '}
    }, // 6
    {
        {' ','-',' '},
        {' ',' ','|'},
        {' ',' ',' '},
        {' ',' ','|'},
        {' ',' ',' '}
    }, // 7
    {
        {' ','-',' '},
        {'|',' ','|'},
        {' ','-',' '},
        {'|',' ','|'},
        {' ','-',' '}
    }, //8
    {
        {' ','-',' '},
        {'|',' ','|'},
        {' ','-',' '},
        {' ',' ','|'},
        {' ','-',' '}
    } // 9
};
 
inline voidprintNumberN(string &num,intrep)
{
    // 计算输出区域的高度与宽度
    intheight = rep*2+ 3; // 高度
    intnumWidth = rep + 2; // 单个数字占据的宽度
    intwidth = num.size()*numWidth + num.size() - 1; //整个输出区域的宽度
    for(inti = 0; i < height; i++)
    {
        for(intj = 0; j < width; j++)
        {
                intno = j/(numWidth+1); //计算no确定输出哪个数字了。
                intnumsNo = num.at(no) - '0'; // 转换为对应的数组的编号。
                /*
                     行映射规则: 将第i行映射到nums对应行的位置
                     0映射到0行
                     1 - rep 映射到 第1行
                     rep + 1 映射到 第2行
                     rep + 2 - rep + 1 + rep 映射到第3行
                     rep*2 + 2 映射到第 4行
 
                     列映射规则:
                     第0列映射到第零列,
                     第1到rep列映射到第一列,
                     第rep+1列映射到第二列
                */
                intx,y; //x表示映射的行,y表示映射到的列
                intyMap = j%(numWidth+1);
                if(yMap == numWidth)
                {
                    // 打印空格
                    x = 0;
                    y = 0;
                }
                else
                {
                    if(yMap == 0)
                    {
                        y = 0;
                    }
                    elseif(yMap >= 1&& yMap <= rep)
                    {
                        y = 1;
                    }
                    elseif(yMap == rep + 1)
                    {
                        y = 2;
                    }
                    if(i == 0)
                    {
                        x = 0;
                    } // 打印0行内容,列号为j%numWidth+1
                    elseif(i >= 1&& i <= rep)
                    {
                        x = 1;
                    } // 打印第nums对应的第1行
                    elseif(i == rep + 1)
                    {
                        x = 2;
                    }
                    elseif(i >= rep + 2&& i <= rep*2+ 1)
                    {
                        x = 3;
                    }
                    elseif(i == rep*2+ 2)
                    {
                        x = 4;
                    }
                }
                printf("%c",nums[numsNo][x][y]);
 
        } // 这个区域输出所有数字,通过no定位数字的位置
        printf("\n");
    } // 在这块区域上输出字符,输出过程中将字符位置转换为输出屏幕上的位置。
}
 
intmain()
{
    // 1 输入以string来输入
    string num;
    intn;
    while(cin >> n >> num)
    {
        //cout<< n <<" " <<num<<endl;
        printNumberN(num,n);
        printf("\n");
    }
    return0;
}

编辑于 2015-10-18 12:21:47 回复(1)
更多回答
用位图来映射字符
// 0 : 1,1,1,0,1,1,1 0x77    // 5 : 1,1,0,1,0,1,1 0x6B
// 1 : 0,0,1,0,0,1,0 0x12    // 6 : 1,1,0,1,1,1,1 0x6F
// 2 : 1,0,1,1,1,0,1 0x5D    // 7 : 1,0,1,0,0,1,0 0x52
// 3 : 1,0,1,1,0,1,1 0x5B    // 8 : 1,1,1,1,1,1,1 0xFF
// 4 : 0,1,1,1,0,1,0 0x3A    // 9 : 1,1,1,1,0,1,1 0x7B
#include <iostream>
#include <string>
using namespace std;  const unsigned char table[10] = { 0x77, 0x12, 0x5D, 0x5B, 0x3A,
				   0x6B, 0x6F, 0x52, 0xFF, 0x7B };

void printHorizon(string & str, int n, int off)
{
	for (int i = 0; i < str.size(); ++i)
	{
		cout << (i ? " " : "");
		cout << ' ';
		for (int j = 0; j < n; ++j)
			cout << ((table[str[i] - '0'] >> off) & 0x01 ? '-' : ' ');
		cout << ' ';
	}
	cout << endl;
}
void printVertical(string & str, int n, int off)
{
	for (int j = 0; j < n; ++j)
	{
		for (int i = 0; i < str.size(); ++i)
		{
			cout << (i ? " " : "");
			cout << ((table[str[i] - '0'] >> off) & 0x01 ? '|' : ' ');
			for (int k = 0; k < n; ++k) cout << ' ';
			cout << ((table[str[i] - '0'] >> (off - 1)) & 0x01 ? '|' : ' ');
		}
		cout << endl;
	}
}

void print(string & str, int n)
{
	printHorizon(str, n, 6);
	printVertical(str, n, 5);
	printHorizon(str, n, 3);
	printVertical(str, n, 2);
	printHorizon(str, n, 0);
	cout << endl;
}

int main() 
{
	int n; string str;
	while (cin >> n >> str)
	{
		print(str, n);
	}
	return 0;
}

发表于 2015-12-20 22:19:18 回复(0)
此题几个坑注意一下:
1、‘\0’ 不要当作 ' '(空格)来使用,虽然肉眼看起来一样,但是底层判断是不一样的,然而数组默认值为 '\0';
2、题目输入输出有点误差;
3、题目判断时,输出来居然跟题目的格式完全不一样,别被骗了,本人在这里被骗惨了,以为是题目给的输入输出为了好理解才这样,没想到就是题目这样的输入输出,误以为测试的时候是那种输入输出格式。
发表于 2017-06-08 10:25:43 回复(1)
#include <stdio.h>
#include <string.h>
#define DIGIT 8
#define MAX_LEN 11
const char seg[10][7] = {{1,1,1,0,1,1,1}, {0,0,1,0,0,1,0}, {1,0,1,1,1,0,1},
/*0-9的七段数码管是否亮起*/{1,0,1,1,0,1,1}, {0,1,1,1,0,1,0}, {1,1,0,1,0,1,1},
        {1,1,0,1,1,1,1}, {1,0,1,0,0,1,0}, {1,1,1,1,1,1,1}, {1,1,1,1,0,1,1}};
int main() {
  int s, input, i, j, num[DIGIT], len;
  char light[MAX_LEN], unlight[MAX_LEN];
  while (scanf("%d %d", &s, &input) != EOF) {
    memset(light, '-', s);
    memset(unlight, ' ', s);
    light[s] = unlight[s] = '\0';
    for (len=-1; input; input /= 10)
      num[++len] = input % 10;
    for (j=len; j>=0; --j)
      printf(" %s %c", seg[num[j]][0]?light:unlight, j ? ' ' : '\n');
    for (i=0; i<s; ++i)
      for (j=len; j>=0; --j)
        printf("%c%s%c%c", seg[num[j]][1]?'|':' ', unlight,
               seg[num[j]][2]?'|':' ', j ? ' ' : '\n');
    for (j=len; j>=0; --j)
      printf(" %s %c", seg[num[j]][3]?light:unlight, j ? ' ' : '\n');
    for (i=0; i<s; ++i)
      for (j=len; j>=0; --j)
        printf("%c%s%c%c", seg[num[j]][4]?'|':' ', unlight,
               seg[num[j]][5]?'|':' ', j ? ' ' : '\n');
    for (j=len; j>=0; --j)
      printf(" %s %c", seg[num[j]][6]?light:unlight, j ? ' ' : '\n');
    printf("\n");
  }
  return 0;
}

发表于 2018-06-08 17:30:20 回复(0)

问题信息

难度:
4条回答 5410浏览

热门推荐

通过挑战的用户

查看代码