riba2534的拷问2

题目描述:

转眼就到了2018年的ACM集训队第二次招新,希望大家在本次比赛中取得好成绩!

看标题名字就知道,历史总是惊人的相似,这个题目和上次招新赛的某道题很像,还是关于A+B问题的,题目是这样的:

给出你一个表达式只包含'+','-'两种运算,然后你要输出对应结果的字符画形式。

给出的表达式形式一定是形如:

 

'a+b','a-b',这种形式,并且保证a和b的范围都在0~9之内.

 

具体的输入和输出可以通过观察样例得到。

##### ....# ##### ##### #...# ##### ##### ##### ##### ##### ..... ..... .....
#...# ....# ....# ....# #...# #.... #.... ....# #...# #...# ..#.. ..... .....
#...# ....# ....# ....# #...# #.... #.... ....# #...# #...# ..#.. ..... #####
#...# ....# ##### ##### ##### ##### ##### ....# ##### ##### ##### ##### .....
#...# ....# #.... ....# ....# ....# #...# ....# #...# ....# ..#.. ..... #####
#...# ....# #.... ....# ....# ....# #...# ....# #...# ....# ..#.. ..... .....
##### ....# ##### ##### ....# ##### ##### ....# ##### ##### ..... ..... .....

 

 

输入描述:

第一行包含一个整数T,代表有T组输入数据
对于每组数据,包含一个表达式,如:
3-5
1+4
0-0

输出描述:

对于每一个表达式,输出对应的字符画,输出方式可以观察样例得到。
对于每组数据,输出一个换行.

样例输入:

复制

4
3-5
9-9
9+9
0-0

样例输出:

#####.......#####.............#####
....#.......#.....................#
....#.......#.....#####...........#
#####.#####.#####.......#####.#####
....#...........#.#####.......#....
....#...........#.............#....
#####.......#####.............#####

#####.......#####.......#####
#...#.......#...#.......#...#
#...#.......#...#.#####.#...#
#####.#####.#####.......#...#
....#...........#.#####.#...#
....#...........#.......#...#
#####.......#####.......#####

#####.......#####...........#.#####
#...#...#...#...#...........#.#...#
#...#...#...#...#.#####.....#.#...#
#####.#####.#####...........#.#####
....#...#.......#.#####.....#.#...#
....#...#.......#...........#.#...#
#####.......#####...........#.#####

#####.......#####.......#####
#...#.......#...#.......#...#
#...#.......#...#.#####.#...#
#...#.#####.#...#.......#...#
#...#.......#...#.#####.#...#
#...#.......#...#.......#...#
#####.......#####.......#####

提示:

注意输出的时候,每个数之间有一排'.'

 

本题如果采用一个一个模拟去做的话,代码会特别多,并且也会浪费特别多的时间。

既然是要打印这些字符,那么我们该怎么打印?

一个数字一个数字打印是十分简单的,但是如果说所有的数字整合到一起去打印,那么这又是十分困难的,而既然一个是简单的,那么如果说一行字符存储到一个数组里面,当成一个数字进行打印的话,问题就变得十分简单了。

{"#####....############...##########################............... "},
{"#...#....#....#....##...##....#........##...##...#..#............ "},
{"#...#....#....#....##...##....#........##...##...#..#.......##### "},
{"#...#....##########################....#####################..... "},
{"#...#....##........#....#....##...#....##...#....#..#.......##### "},
{"#...#....##........#....#....##...#....##...#....#..#............ "},
{"#####....###########....###########....###########............... "},

这里先在数组num_cc[7][70]里面进行储存,那么调用的话就可以直接通过数组的下标来实现。

比如说0,是从0开始的

           1,是从5开始的

           等等。

于是乎,就有了调用的函数

int num_puts(int num)
{
    if(num<=9&&num>=0)
    {
        return 5*num;
    }
    else if((char)num=='+')
    {
        return 50;
    }
    else if((char)num=='-')
    {
        return 55;
    }
    else
        return 60;
    //开头的元素是0
}

但是进行存储的时候可以直接对 a + b =  进行存储,后面的结果不能直接存储,而是进行简单的判断以后进行存储。

 if(num<0)
        {
           num_index[total++]=num_puts('-');
           num=-num;
        }
        if(num/10)//现在表示的是 如果num>10,那么这个时候的考虑情况
        {
           num_index[total++]=num_puts(num/10);
           num%=10;
        }

这里就是考虑1.当结果小于0   2.当结果大于等于10 两种情况,其中,如果一个数小于0,那么这个数也会有可能是两位的,那么可以对其进行一个整合。

最后,也是最为关键的了,那就是输出。

我们的输出必须是随着a+b=?的移动而移动数组下标的。

每组5个字符,那么5个就是每次的移动范围。

而此时还没有说从哪里开始,当然是从输入的元素所对应的数组中的下标开始喽。

for(int i=0;i<7;++i)//现在问题就是怎么把他们给输出到屏幕
           {
               for(int j=0;j<total;++j)
               {
                  if(j) printf(".");
                  int now_index=num_index[j];
                  for(int k=0;k<5;++k)
                  printf("%c",num_cc[i][now_index+k]);
               }
               printf("\n");
           }

最后别忘了换行。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值