描述
你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。
输入
输入包括若干行,每行表示一个要显示的数。每行有两个整数s和n (1 <= s <= 10, 0 <= n <= 99999999),这里n是要显示的数,s是要显示的数的尺寸。
如果某行输入包括两个0,表示输入结束。这行不需要处理。
输出
显示的方式是:用s个’-‘表示一个水平线段,用s个’|’表示一个垂直线段。这种情况下,每一个数字需要占用s+2列和2s+3行。另外,在两个数字之间要输出一个空白的列。在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
样例输入
2 12345
3 67890
0 0
样例输出
第一步:数字笔画分解,把数字0~9的笔画顺序以一倍大小(即s=1的情况)写出来,即
由上表可知,每个数字均可由七笔画写出,虽然有的笔画是空白。
第二步:把各个数字的笔画顺序以字符数组的形式储存起来,在后续编程时调用,n1[0]即为数字0的第一笔,n2[0]即为数字0的第二笔,n5[6]即为数字6的第五笔,注意n1[1]的内容虽然为空白,但依然视为数字1的第一笔。
第三步:以输入字符串”8”为例,演示在s=1,s=2两种情况下的表达区别。
当s=1时:
当s=2时:
可见,数字8在s=2时,要把第一笔、第四笔、第七笔同一行地复制2遍,第二、三笔,第四、六笔要换行地复制两遍。这样便可推测出任意数字在s=???时,要把第一笔、第四笔、第七笔同一行地复制s遍,第二、三笔,第四、六笔要换行地复制s遍。
第四步:根据以上思路进行编程。
//例题:显示器(POJ2745)
#include<iostream>
int main()
{
int s;//放大倍数
char n[20];//给输入的字符串提供空间
char n1[11] = "- -- -----";//所有数字的第一笔画
char n2[11] = "| ||| ||";//所有数字的第二笔画
char n3[11] = "||||| |||";//所有数字的第三笔画
char n4[11] = " ----- --";//所有数字的第四笔画
char n5[11] = "| | | | ";//所有数字的第五笔画
char n6[11] = "|| |||||||";//所有数字的第六笔画
char n7[11] = "- -- -- --";//所有数字的第七笔画
while (scanf("%d %s", &s, n)!=EOF)
{
if (s == 0)//结束条件
return 0;
int length = strlen(n);//算出输入字符串(除了结尾\0)的实际长度
for (int i = 0; i < length; ++i)//所有数字的第一笔画开始
{
int num = n[i] - '0';//n是输入的字符串,类型是char,'0'也是char类型,两者相减得出对应的数字
printf(" ");//数字左上角那个空格
for (int j = 0; j < s; ++j)
{
printf("%c",n1[num]);//所有数字的第一笔画
}
printf(" ");//数字右上角那个空格
}
printf("\n");//所有数字的第一笔画完成
for (int j = 0; j < s; ++j)//第二、三笔画采用先写出一行,然后再把一整行复制到下一行的方法来实现字体扩大
{
for (int i = 0; i < length; ++i)
{
int num = n[i] - '0';
printf("%c", n2[num]);
for (int j = 0; j < s; ++j)
printf(" ");//第二笔画和第三笔画之间的空格
printf("%c", n3[num]);
}
printf("\n");
}//所有数字的第二、三笔画完成
//接下来的代码第四、七笔画就是第一笔画部分代码的复制,只需要把n1[num]改写成对应的n4[num]、n7[num];同理第五、六笔画就是第二、三笔画的复制,只许将n2[num]改为n5[num],n3[num]改为n6[num]
for (int i = 0; i < length; ++i)//所有数字的第四笔画开始
{
int num = n[i] - '0';//n是输入的字符串,类型是char,'0'也是char类型,两者相减得出对应的数字
printf(" ");//数字左上角那个空格
for (int j = 0; j < s; ++j)
{
printf("%c", n4[num]);//所有数字的第四笔画
}
printf(" ");//数字右上角那个空格
}
printf("\n");//所有数字的第四笔画完成
for (int j = 0; j < s; ++j)//第五、六笔画采用先写出一行,然后再把一整行复制到下一行的方法来实现字体扩大
{
for (int i = 0; i < length; ++i)
{
int num = n[i] - '0';
printf("%c", n5[num]);
for (int j = 0; j < s; ++j)
printf(" ");//第五笔画和第六笔画之间的空格
printf("%c", n6[num]);
}
printf("\n");
}//所有数字的第五、六笔画完成
for (int i = 0; i < length; ++i)//所有数字的第七笔画开始
{
int num = n[i] - '0';//n是输入的字符串,类型是char,'0'也是char类型,两者相减得出对应的数字
printf(" ");//数字左上角那个空格
for (int j = 0; j < s; ++j)
{
printf("%c", n7[num]);//所有数字的第七笔画
}
printf(" ");//数字右上角那个空格
}
printf("\n");//所有数字的第七笔画完成
}
return 0;
}
第五步:总结复杂度,我认为应该是测试次数ncase乘以每次数据字符串大小length,即O(ncase×length),就算是书本《算法基础与在线实践》那种方法复杂度我也不认同是O(ncase)