USC 1143:显示器
具体题目请点击以下链接: 点击打开链接对于该题,我们可以先讨论s=1时的情况。 当s=1时,我们可以在五行三列的方格中,将数字0-9相应部分用黑色
填充。然后发现以下规律:
可以将数字分为5个部分(即5行),每一行不同的数字有相同的部分。
1 【1】0、2、3、5、6、7、8、9 【2】1、4
2 【1】1、2、3、7 【2】5、6 【3】0、4、8、9
3 【1】0、1、7 【2】2、3、4、5、6、8、9
4 【1】2 【2】0、6、8 【3】1、3、4、5、7、9
5 【1】1、4、7 【2】0、2、3、5、6、8、9
当n>1时,规律也一样。具体代码如下(代码中是0-4行):
#include<stdio.h>
#include<string.h>
int main()
{
int s,i,j,k,x,y;
char b[15],ch;
while(scanf("%d %s",&s,b)!=EOF)
{
if(s==0&&b[0]=='0')
return 0;
i=0;
while(i<5)
{
if(i==0||i==2||i==4)
{
for(j=0; j<strlen(b); j++)
{
ch=b[j];
switch(i)
{
case 0:
switch(ch)
{
case '1':
case '4':
{
if(j!=0) putchar(' ');
for(k=1; k<=s+2; k++) putchar(' ');
}
break;
case '0':
case '2':
case '3':
case '5':
case '6':
case '7':
case '8':
case '9':
{
if(j!=0) putchar(' ');
putchar(' ');
for(k=1; k<=s; k++) putchar('-');
putchar(' ');
}
break;
}
break;
case 2:
switch(ch)
{
case '0':
case '1':
case '7':
{
if(j!=0) putchar(' ');
for(k=1; k<=s+2; k++) putchar(' ');
}
break;
case '4':
case '2':
case '3':
case '5':
case '6':
case '8':
case '9':
{
if(j!=0) putchar(' ');
putchar(' ');
for(k=1; k<=s; k++) putchar('-');
putchar(' ');
}
break;
}
break;
case 4:
switch(ch)
{
case '1':
case '4':
case '7':
{
if(j!=0) putchar(' ');
for(k=1; k<=s+2; k++) putchar(' ');
}
break;
case '0':
case '2':
case '3':
case '5':
case '6':
case '8':
case '9':
{
if(j!=0) putchar(' ');
putchar(' ');
for(k=1; k<=s; k++) putchar('-');
putchar(' ');
}
break;
}
break;
}
}
putchar('\n');
}
else if(i==1||i==3)
switch(i)
{
case 1:
for(x=1; x<=s; x++)
{
for(y=0; y<strlen(b); y++)
{
ch=b[y];
switch(ch)
{
case '0':
case '4':
case '8':
case '9':
{
if(y!=0) putchar(' ');
putchar('|');
for(k=1; k<=s; k++) putchar(' ');
putchar('|');
}
break;
case '5':
case '6':
{
if(y!=0) putchar(' ');
putchar('|');
for(k=1; k<=s+1; k++) putchar(' ');
}
break;
case '1':
case '2':
case '3':
case '7':
{
if(y!=0) putchar(' ');
for(k=1; k<=s+1; k++) putchar(' ');
putchar('|');
}
break;
}
}
putchar('\n');
}
break;
case 3:
for(x=1; x<=s; x++)
{
for(y=0; y<strlen(b); y++)
{
ch=b[y];
switch(ch)
{
case '4':
case '1':
case '3':
case '5':
case '7':
case '9':
{
if(y!=0) putchar(' ');
for(k=1; k<=s+1; k++) putchar(' ');
putchar('|');
}
break;
case '2':
{
if(j!=0) putchar(' ');
putchar('|');
for(k=1; k<=s+1; k++) putchar(' ');
}
break;
case '0':
case '6':
case '8':
{
if(y!=0) putchar(' ');
putchar('|');
for(k=1; k<=s; k++) putchar(' ');
putchar('|');
}
break;
}
}
putchar('\n');
}
break;
}
i++;
}
putchar('\n');
memset(b,0,sizeof b);
}
return 0;
}
我是以5个部分枚举的,当然也可以从0-9每个数字分别枚举。
运行效果如下:
也可以使用打表法,更简洁明了,参考代码如下:
#include <stdio.h>
#include <string.h>
char n1[11] = {"- -- -----"};
char n2[11] = {"| ||| ||"};
char n3[11] = {"||||| |||"};
char n4[11] = {" ----- --"};
char n5[11] = {"| | | | "};
char n6[11] = {"|| |||||||"};
char n7[11] = {"- -- -- --"};
int main()
{
int s;
char szNumber[20];
int nDigit , nLength, i , j , k;
while(1)
{
scanf( "%d%s", &s, szNumber);
if (s == 0) break;
nLength = strlen(szNumber);
for (i = 0 ; i < nLength ; i++) //输出所有数字的笔画 1
{
nDigit = szNumber[i] - '0';
printf(" ");
for (j = 0 ; j < s ; j++) printf("%c", n1[nDigit]);
printf(" ");
}
printf("\n");
for (i = 0 ; i < s ; i++) //输出所有数字的笔画2 和笔画3
{
for (j = 0 ; j < nLength ; j++)
{
nDigit = szNumber[j] - '0';
printf("%c", n2[nDigit]);
for (k = 0 ; k < s ; k++) printf(" ");
printf("%c ", n3[nDigit]);
}
printf("\n");
}
for (i = 0 ; i < nLength ; i++) //输出所有数字的笔画4
{
printf(" ");
nDigit = szNumber[i] - '0';
for (j = 0 ; j < s ; j++) printf("%c", n4[nDigit]);
printf(" ");
}
printf("\n");
for (i = 0 ; i < s ; i++) //输出所有数字的笔画 5 和笔画 6
{
for (j = 0 ; j < nLength ; j++)
{
nDigit = szNumber[j] - '0';
printf("%c", n5[nDigit]);
for (k = 0 ; k < s ; k++) printf( " ");
printf("%c ", n6[nDigit]);
}
printf("\n");
}
for (i = 0 ; i < nLength ; i++) //输出所有数字的笔画 7
{
printf(" ");
nDigit = szNumber[i] - '0';
for (j = 0 ; j < s ; j++) printf("%c", n7[nDigit]);
printf(" ");
}
printf("\n");
printf("\n");
}
}