题目描述:
转眼就到了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");
}
最后别忘了换行。