简单的来说,就是将一串数字转换成LC显示风格输出,考的就是对输出的控制,当有了一定的逻辑结构之后,其实输出就变的十分简单了。
首先我们要了解lc格式是怎样子,因为输出样例里已经有了,所以这里不作解释。
说到输出数字串,首先要想到循环,这句话看似无用,实际上,这道题的难点就在于怎么控制循环。我们首先会自然而然地想到,直接一个一个地将数字输出不就得了,但是,输出一个lc风格的数字,是要占多行的,如果以数字为单位输出,其中必须经过换行,那么就不可能输出一串数字了,这个方法首先就应该放弃。
我们来考虑一下,日常生活中lc风格的的数字是怎样的,七根小灯管垂直排布,没跟灯管根据接受的的信号不同,选择自己的状态是亮还是灭(这里扯一句闲话,老师是因为将二进制才牵扯到这道题的,虽然本身和二进制关系不大,但是有相似性,所以读到这里可以联想一下二进制,0代表关,1代表开,灯管接受到0就灭,接收到1就打开,可以这么理解,这种方法可以放在题目的解法里面,这个我们稍后再说),最终展示出我们想要的数字。
------1
|2 |3
------4
|5 |6
-------7
从上至下,依次给灯管排号,第一行输出1号灯管,第2~s+1行输出2号和3号灯管,第s+2行输出4号灯管,第s+3到2s+2行输出5号和6号灯管,第2s+3行输出第7跟灯管。这种按照灯管的方法输出,可以一行输出多个数字了。经典的分组输出。
那么,上代码吧,但是一百多行的代码,十分臃肿不好看的,那我把它拆开吧。
输入和储存
scanf("%d%d",&s,&n);
if(s==0&&n==0)
break;
int re=n;//设置一个储存器储存这一串数字,以便于后来重置
第一行(输出1)
int i,m,a;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
{
putchar(' ');
i++;
}
else if(i!=1)
{
putchar(' ');
putchar(' ');
}
for(int j=1;j<=s;j++)
{
if(m==2||m==3||m==5||m==6||m==7||m==8||m==9||m==0)
putchar('-');
else
putchar(' ');
}
putchar(' ');
n=n%a;
}
printf("\n");
第2~s+1行(输出2)
n=re;//重置变量
for(int j=1;j<=s;j++)
{
n=re;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
i++;
else if(i!=1)
putchar(' ');
if(m==4||m==5||m==6||m==8||m==9||m==0)
putchar('|');
else
putchar(' ');
for(int l=1;l<=s;l++)
putchar(' ');
if(m==1||m==2||m==3||m==4||m==7||m==8||m==9||m==0)
putchar('|');
else
- putchar(' ');
n%=a;
}
printf("\n");
}
这里没有用到数组和其他知识的原因是班里的学习进度就只能用for,while,if-else语句。
这里有一些需要注意的地方
1.因为输入的是一个数,要把他单独拆开,这就是变量a存在的意义。
2.因为每一个数字之间有一列空格分开,所以要判断是不是第一个输出的数字,这就是变量i存在的意义。
3.第4和第7根灯管和输出1的方法相同,第5,6根和输出2相同,只不过改一下输出条件而已。
这里就要说一下之前提到的二进制,然后就是解题方法。这里可以用一个二维数组和一个字符串数组,这样也可以实现输出,判断输出也没有这么麻烦,比如说,1只需要输出第3和6根灯管,那么对应的数字就是{0,0,1,0,0,1,0},8需要点亮所有的灯管,所以对应的数字就是{1,1,1,1,1,1,1},然后根据strlen函数判断输入的字符串的长度判断循环次数,将字符对应的ASCII码减去30得到对应数字,根据接收到的是0或1来决定是否点亮灯管,也是可以得到想要的结果的,这里因为思路大致相同就没有写出对应的代码,读到这里的人可以自己去尝试一下。
但是,无论方法是如何,没有一个完整清晰的思路一定是没用的,所以,在做题之前,一定要有一条清晰完整的思路,让先算法后编程成为一种习惯,当然,对于繁琐的代码,耐心也是很有必要的,贵在坚持。
最后,看一下代码的全貌吧
#include<stdio.h>
int main()
{
int s,n;
while(1)
{
scanf("%d%d",&s,&n);
if(s==0&&n==0)
break;
int re=n;//设置一个储存器储存这一串数字,以便于后来重置
int i,m,a;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
{
putchar(' ');
i++;
}
else if(i!=1)
{
putchar(' ');
putchar(' ');
}
for(int j=1;j<=s;j++)
{
if(m==2||m==3||m==5||m==6||m==7||m==8||m==9||m==0)
putchar('-');
else
putchar(' ');
}
putchar(' ');
n=n%a;
}
printf("\n");
n=re;//重置变量
for(int j=1;j<=s;j++)
{
n=re;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
i++;
else if(i!=1)
putchar(' ');
if(m==4||m==5||m==6||m==8||m==9||m==0)
putchar('|');
else
putchar(' ');
for(int l=1;l<=s;l++)
putchar(' ');
if(m==1||m==2||m==3||m==4||m==7||m==8||m==9||m==0)
putchar('|');
else
- putchar(' ');
n%=a;
}
printf("\n");
}
n=re;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
{
putchar(' ');
i++;
}
else if(i!=1)
{
putchar(' ');
putchar(' ');
}
for(int j=1;j<=s;j++)
{
if(m==2||m==3||m==4||m==5||m==6||m==8||m==9)
putchar('-');
else
putchar(' ');
}
putchar(' ');
n=n%a;
}
printf("\n");
n=re;
for(int j=1;j<=s;j++)
{
n=re;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
i++;
else if(i!=1)
putchar(' ');
if(m==2||m==6||m==8||m==0)
putchar('|');
else
putchar(' ');
for(int l=1;l<=s;l++)
putchar(' ');
if(m==1||m==3||m==4||m==5||m==6||m==7||m==8||m==9||m==0)
putchar('|');
else
- putchar(' ');
n%=a;
}
printf("\n");
}
n=re;
for(a=1;n/a>10;a*=10);
for(i=1;a>0;a/=10)
{
m=n/a;
if(i==1)
{
putchar(' ');
i++;
}
else if(i!=1)
{
putchar(' ');
putchar(' ');
}
for(int j=1;j<=s;j++)
{
if(m==2||m==3||m==5||m==6||m==8||m==9||m==0)
putchar('-');
else
putchar(' ');
}
putchar(' ');
n=n%a;
}
printf("\n");
printf("\n");
}
}