【问题描述】
你的一个朋友买了一台电脑。 他以前只用过计算器, 因为电脑的显示器上显示的数字的样子和计算器是不一样, 所以当他使用电脑的时候会比较郁闷。 为了帮助他, 你决定写一个程序把在电脑上的数字显示得像计算器上一样。
【输入数据】
输入包括若干行,每行表示一个要显示的数。每行有两个整数 s 和 n (1 <= s <= 10, 0<=n<= 99999999) ,这里 n 是要显示的数, s 是要显示的数的尺寸。如果某行输入包括两个0,表示输入结束。这行不需要处理。
【输出要求】
显示的方式是: 用 s 个'-'表示一个水平线段, 用 s 个 '|'表示一个垂直线段。 这种情况下,每一个数字需要占用 s+2 列和 2s+3 行。另外,在两个数字之间要输出一个空白的列。 在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
【输入样例】
2 12345
3 67890
0 0
你的一个朋友买了一台电脑。 他以前只用过计算器, 因为电脑的显示器上显示的数字的样子和计算器是不一样, 所以当他使用电脑的时候会比较郁闷。 为了帮助他, 你决定写一个程序把在电脑上的数字显示得像计算器上一样。
【输入数据】
输入包括若干行,每行表示一个要显示的数。每行有两个整数 s 和 n (1 <= s <= 10, 0<=n<= 99999999) ,这里 n 是要显示的数, s 是要显示的数的尺寸。如果某行输入包括两个0,表示输入结束。这行不需要处理。
【输出要求】
显示的方式是: 用 s 个'-'表示一个水平线段, 用 s 个 '|'表示一个垂直线段。 这种情况下,每一个数字需要占用 s+2 列和 2s+3 行。另外,在两个数字之间要输出一个空白的列。 在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。
【输入样例】
2 12345
3 67890
0 0
【输出样例】
【思路】:
坦率地讲,一点儿思路也没有,于是上网搜之,这时候你才觉得不管解什么题,思路最重要,有的报告一上来就是代码甚至通篇是代码,过几年估计自己看也未必看懂,所以一定一定一定要写清楚思路,再不济把关键步骤的注释标上。
1 输入数据的表示
1.1 题中要求输入两个数,其中数字序列n介于0到999 999 999之间,对n处理时需要拆解出序列的单个数字,而单个数字的范围是 0~9,因而选用字符数组比整型数,整型数组无论时间还是空间复杂度都来得低。
1.2 单个数字digit与每划一笔构成的LCD型数字之间有映射关系,每划一笔构成的LCD型数字与每划s笔构成的LCD数字之间也有一定的映射关系。
1.2.1 第一个映射关系,把数字0~9的LCD显示列出,发现每个LCD显示的数字笔画如图所示,只不过,有的笔画是空,有的笔画是 | 或者 - 把lcd每划一笔的数字按划按行列出。
1.2.2 每第二个映射关系,每划一笔与每划s笔之间存在s倍的关系。如图所示,注意,绿色部分也有倍数关系,红色部分无论s是几始终是一个.
另外注意,单个数字之间有一列隔开。每个数字序列输出结束,空行隔开。
代码:
因为最后有 \0所以第二维长11
char stoke1[]={"- -- -----"};// ±Ê» 1 ±»Êý×Ö 0,2,3,5,6,7,8,9 ¸²¸Ç
char stoke2[]={"| ||| ||"}; // ±Ê» 2 ±»Êý×Ö 0,4,5,6,8,9 ¸²¸Ç
char stoke3[]={"||||| |||"}; // ±Ê» 3 ±»Êý×Ö 0,1,2,3,4,7,8,9 ¸²¸Ç
char stoke4[]={" ----- --"}; // ±Ê» 4 ±»Êý×Ö 2,3,4,5,6,8,9 ¸²¸Ç
char stoke5[]={"| | | | "}; // ±Ê» 5 ±»Êý×Ö 0,2,6,8 ¸²¸Ç
char stoke6[]={"|| |||||||"};// ±Ê» 6 ±»Êý×Ö 0,1,3,4,6,7,8,9 ¸²¸Ç
char stoke7[]={"- -- -- --"};// ±Ê» 7 ±»Êý×Ö 0,2,3,5,6,8,9 ¸²¸Ç
有10个数,每个数5行,每行3列
/**
- 笔画1 空格 字符 空格
| | 笔画2,3 字符(笔画2) 空格 字符(笔画3)
- 笔画4 空格 字符 空格
| | 笔画5,6 笔画5 空格 笔画6
- 笔画7 空格 字符(笔画7) 空格
*/
/**单个数字之间的空格*/
int lcd()
{
//s 单笔画长度
int s;
//n 数字序列
char n[10];
// 当前的单个数字
int digit=0;
//数字序列的长度
int numLength, i=0 , j=0 ,k=0;
while(scanf("%d%s",&s,n))
{
/**归零*/
i=0,j=0,k=0;
numLength=0;
memset(n,'\0',numLength);
if (s == 0)
break;
while(n[i++]!='\0')
{
++numLength;
}
for (i = 0 ; i < numLength ; i++)
{
//注意digit(n1的下标和i(n的下标)没有直接关系)
//char ->int
digit = n[i] - '0';
printf(" ");
for (j = 0 ; j < s ; j++)
printf("%c",stoke1[digit]);
printf(" ");
printf(" ");
}
//下一行
printf("\n");
// 输出所有数字的笔画 2 和笔画 3
for (i = 0 ; i < s ; i++)
{
for (j = 0 ; j < numLength ; j++)
{
digit = n[j] - '0';
printf("%c", stoke2[digit]);
// 笔画 2 和笔画 3 之间的空格
for (k = 0 ; k < s ; k++)
printf(" ");
printf("%c",stoke3[digit]);
printf(" ");
}
printf("\n");
}
//输出所有数字的笔画 4
for (i = 0 ; i < numLength ; i++)
{
digit = n[i] - '0';
printf(" ");
for (j = 0 ; j < s ; j++)
printf("%c", stoke4[digit]);
printf(" ");
printf(" ");
}
printf("\n");
for (i = 0 ; i < s ; i++)
{ //输出所有数字的笔画 5 和笔画 6
for (j = 0 ; j < numLength ; j++)
{
digit = n[j] - '0';
printf("%c", stoke5[digit]);
// 笔画 5 和笔画 6 之间的空格
for (k = 0 ; k < s ; k++)
printf(" ");
printf("%c", stoke6[digit]);
printf(" ");
}
printf("\n");
}
// 输出所有数字的笔画 7
for (i = 0 ; i < numLength ; i++)
{
printf(" ");
digit = n[i] - '0';
for (j = 0 ; j < s ; j++)
printf("%c", stoke7[digit]);
printf(" ");
printf(" ");
}
printf("\n");
printf("\n");
}
return 0;
}
输出结果示例
代码编写注意点:
当循环体内改变了下一个循环需要的数据初始值时,在本次循环即将结束或者下一次循环开始之初,都要对这些变量重新赋予初值。