Peck Chen

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

模拟题...

输出指定大小的数, 看课件的时候没往后看它的解题思路,自已用自己的思路写...好吧,400+

if...else 一大堆...真累

测试数据过了,一交,错了...没注意到输出单个0是出错....后来改了, 对了

做完之后一看后面的解题思路....我晕,别人100和内就A了...

思路是:8覆盖所有数字, 一共七画, 用七个数组记录从容不迫0 ~ 9的第一~七画,然后一行一行输出,

一共2*size + 3行...不能一个数字一个数字地输出....

 

Accepted 260kB 0ms 6810 B G++

 

代码
#include <stdio.h>
#include
<stdlib.h>
#define N 10 /* 最多位数不超10 */

/* 转换为整型数组 */
void to_array(int *elem, int num, int *len)
{
int i, j;

if (num == 0)
{
*len = 1;
elem[
0] = 0;

return;
}

i
= 0;
while ( num )
{
elem[i
++] = num % 10;
num
/= 10;
}
*len = i;

j
= i - 1;
i
= 0;
while (i < j)
{
elem[i]
^= elem[j];
elem[j]
^= elem[i];
elem[i]
^= elem[j];

i
++;
j
--;
}
}

/* 第row行大小为size的数字num */
void print_num(int num, int size, int row)
{
int i, len;

len
= size + 2;
switch ( num )
{
case 1: /* 数字为1的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == (2 * size + 3))
{
putchar(
' ');
}
else /* 数字为1的其余行 */
{
if (i != len)
{
putchar(
' ');
}
else
{
putchar(
'|');
}
}
}
break;

case 2: /* 数字为2的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == (2 * size + 3))
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else
{
if (row >= 2 && row <= size + 1)
{
if (i != len)
{
putchar(
' ');
}
else
{
putchar(
'|');
}
}
else
{
if (i != 1)
{
putchar(
' ');
}
else
{
putchar(
'|');
}
}
}
}
break;

case 3: /* 数字为3的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == (2 * size + 3))
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else
{
if (i != len)
{
putchar(
' ');
}
else
{
putchar(
'|');
}
}
}
break;

case 4: /* 数字为4的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (2 * size + 3))
{
putchar(
' ');
}
else if (row >= 2 && row <= size + 1)
{
if (i == 1 || i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
else if (row == size + 2)
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else
{
if (i != len)
{
putchar(
' ');
}
else
{
putchar(
'|');
}
}
}
break;

case 5: /* 数字为5的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == (2 * size + 3))
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else if (row >= 2 && row <= size + 1)
{
if (i == 1)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
else
{
if (i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
}
break;

case 6: /* 数字为6的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == (2 * size + 3))
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else if (row >= 1 && row <= size + 1)
{
if (i == 1)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
else
{
if (i == 1 || i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
}
break;

case 7: /* 数字为7的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1)
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else if (row == (size + 2) || row == (2 * size + 3))
{
putchar(
' ');
}
else
{
if (i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
}
break;

case 8: /* 数字为8的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == 2 * size + 3)
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else
{
if (i == 1 || i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
}
break;

case 9: /* 数字为9的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (size + 2) || row == (2 * size + 3))
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else if (row >= 2 && row <= size + 1)
{
if (i == 1 || i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
else
{
if (i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
}
break;

default : /* 数字为9的第row行, len为所占字符个数 */
for (i = 1; i <= len; i++)
{
if (row == 1 || row == (2 * size + 3))
{
if (i == 1 || i == len)
{
putchar(
' ');
}
else
{
putchar(
'-');
}
}
else if (row == size + 2)
{
putchar(
' ');
}
else
{
if (i == 1 || i == len)
{
putchar(
'|');
}
else
{
putchar(
' ');
}
}
}
break;

}
}

/* 输出 */
void print(int *elem, int len, int size)
{
int i, j;

for (i = 1; i <= 2 * size + 3; i++) /* 这个数的第i行 */
{
for (j = 0; j < len; j++) /* 第i行的第j个数字 */
{
print_num(elem[j], size, i);

if (j != (len - 1))
{
putchar(
' ');
}
}

putchar(
'\n'); /* 这个数的第一行输出完成后 */
}
}

int main()
{
int size, num, len;
int *elem = NULL;

if ((elem=(int *) calloc (N, sizeof(int))) == NULL) {
printf(
"空间分配失败!\n");
exit(
-1);
}
while (scanf("%d%d", &size, &num), size + num)
{
to_array(elem, num,
&len); /* 转换为数组 */
print(elem, len, size);
/* 输出 */

putchar(
'\n');
}

free(elem);
elem
= NULL;

return 0;
}

 

 

 

参考算法后代码短多了...

但PE了几次, 用一些标记整理了一下, 很快找出PE的地方了,PE是因为末尾多了些空格或少了些空格.

用一大堆符号标记, 就很容是看出哪多哪少空格了...^_^

 

Accepted 260kB 0ms 2712B G++

 

代码
#include <stdio.h>
#include
<string.h>
#define N 11

int main()
{
int size, i, j, k, index, len;
char num[N];
char c1[N] = {"- -- -----"}; /*0~9的第一画*/
char c2[N] = {"| ||| ||"}; /*0~9的第二画*/
char c3[N] = {"||||| |||"}; /*0~9的第三画*/
char c4[N] = {" ----- --"}; /*0~9的第四画*/
char c5[N] = {"| | | | "}; /*0~9的第五画*/
char c6[N] = {"|| |||||||"}; /*0~9的第六画*/
char c7[N] = {"- -- -- --"}; /*0~9的第七画*/


while ( 1 )
{
scanf(
"%d%s", &size, num);
len
= strlen( num );
if (size == 0)
{
break;
}

/* 每个数字的第一画 */
for (i = 0; i < len; i++)
{
index
= num[i] - '0';
putchar(
' '); /* 数字的角 */
for (j = 0; j < size; j++)
{
putchar(c1[index]);
}
putchar(
' '); /* 数字的角 */

if (i != (len - 1))
{
putchar(
' '); /* 两数字间都要加空格 */
}
}

putchar(
'\n'); /* 最后一个数 */

/* 每个数字的第二笔和第三笔 */
for (i = 0; i < size; i++) /* 第二笔和第三笔共有size行 */
{
for(j = 0; j < len; j++) /* 一共len个数字 */
{
index
= num[j] - '0';
putchar(c2[index]);
for (k = 0; k < size; k++)
{
putchar(
' '); /* 数字里的空格 */
}
putchar(c3[index]);

if (j != (len - 1))
{
putchar(
' '); /* 两数字间都要加空格 */
}
}

putchar(
'\n'); /* 最后一个数 */
}

/* 每个数字的第四笔 */
for (i = 0; i < len; i++)
{
index
= num[i] - '0';
putchar(
' '); /* 数字的四个角都是空格 */
for (j = 0; j < size; j++)
{
putchar(c4[index]);
}
putchar(
' '); /* 数字的四个角都是空格 */

if (i != (len - 1))
{
putchar(
' '); /* 两数字间都要加空格 */
}
}

putchar(
'\n'); /* 最后一个数 */

/* 每个数字的第五、六笔 */
for (i = 0; i < size; i++)
{
for (j = 0; j < len; j++)
{
index
= num[j] - '0';
putchar(c5[index]);
/* 数字的角 */
for (k = 0; k < size; k++)
{
putchar(
' '); /* 数字里的空格 */
}
putchar(c6[index]);
/* 数字的角 */

if (j != (len - 1))
{
putchar(
' '); /* 两个数字之间要加空格 */
}
}

putchar(
'\n'); /* 最后一个数字 */
}

/* 每个数字的第七笔 */
for (i = 0; i < len; i++)
{
index
= num[i] - '0';
putchar(
' '); /* 数字的角 */
for (j = 0; j < size; j++)
{
putchar(c7[index]);
}
putchar(
' '); /* 数字的角 */

if (i != (len - 1))
{
putchar(
' '); /* 两数字之间要加空格 */
}
}

putchar(
'\n'); /* 最后一个数字 */

putchar(
'\n'); /* 每组数据之加一空行 */
}

return 0;
}

 

 

 

 

 

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

输入
输入包括若干行,每行表示一个要显示的数。每行有两个整数s和n
(1 <= s <= 10, 0 <= n <= 99999999),这里n是要显示的数,s是要显示的数的尺寸。
如果某行输入包括两个0,表示输入结束。这行不需要处理。

输出
显示的方式是:用s个'-'表示一个水平线段,用s个'|'表示一个垂直线段。这种情况下,每
一个数字需要占用s+2列和2s+3行。另外,在两个数字之间要输出一个空白的列。
在输出完每一个数之后,输出一个空白的行。注意:输出中空白的地方都要用空格来填充。

样例输入
2 12345
3 67890
0 0

样例输出
      --   --        --
   |    |    | |  | |
   |    |    | |  | |
      --   --   --   --
   | |       |    |    |
   | |       |    |    |
      --   --        --

 ---   ---   ---   ---   ---
|         | |   | |   | |   |
|         | |   | |   | |   |
|         | |   | |   | |   |
 ---         ---   ---
|   |     | |   |     | |   |
|   |     | |   |     | |   |
|   |     | |   |     | |   |
 ---         ---   ---   ---
提示
数字(digit)指的是0,或者1,或者2……或者9。
数(number)由一个或者多个数字组成。

posted on 2010-11-25 12:59  PeckChen  阅读(514)  评论(0编辑  收藏  举报