POJ2745_注释版

    描述
    你的一个朋友买了一台电脑。他以前只用过计算器,因为电脑的显示器上显示的数字的样子和计算器是不一样,所以当他使用电脑的时候会比较郁闷。为了帮助他,你决定写一个程序把在电脑上的数字显示得像计算器上一样。

    输入
    输入包括若干行,每行表示一个要显示的数。每行有两个整数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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值