题目
蒜头君有一块数码管显示屏,只能显示数字。
每个数字的显示如下。
每 <math> <semantics> <mrow> <mn> 7 </mn> </mrow> <annotation encoding="application/x-tex"> 7 </annotation> </semantics> </math>7 个数码管用来显示一个数字。
-
| |
-
| |
-
每个数字对应的输出如下。
- - - - - - - -
| | | | | | | | | | | | | |
- - - - - - -
| | | | | | | | | | | | |
- - - - - - -
当然为了看起来更形象,可以把数字放大输出,比如放大两倍每个数字对应如下
-- -- -- -- -- -- -- --
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
-- -- -- -- -- -- -- --
| | | | | | | | | | | | |
| | | | | | | | | | | | |
-- -- -- -- -- -- -- --
输入格式
输入两个整数 <math> <semantics> <mrow> <mi> k </mi> <mo> ( </mo> <mn> 1 </mn> <mo> ≤ </mo> <mi> k </mi> <mo> ≤ </mo> <mn> 10 </mn> <mo separator="true"> , </mo> <mn> 0 </mn> <mo> ≤ </mo> <mi> n </mi> <mo> ≤ </mo> <mn> 99999999 </mn> <mo> ) </mo> </mrow> <annotation encoding="application/x-tex"> k(1 \le k \le 10, 0 \le n \le 99999999) </annotation> </semantics> </math>k(1≤k≤10,0≤n≤99999999),分别表达放大的倍数和需要输出的数字。
输出格式
输出数码管显示的数字,数字每一位之间用一列空格隔开。
样例输入
2 12345
样例输出
-- -- --
| | | | | |
| | | | | |
-- -- -- --
| | | | |
| | | | |
-- -- --
样例输入
3 67890
样例输出
--- --- --- --- ---
| | | | | | | |
| | | | | | | |
| | | | | | | |
--- --- ---
| | | | | | | |
| | | | | | | |
| | | | | | | |
--- --- --- ---
题解
这道题最重要的就是拆分
对于一个某个数,可以拆分为 5 个部分,即 最上面的横,上面的竖,中间的横,下面的竖和最下面的横
而竖又可以拆分为 前面的竖和后面的竖
倍数放大对于横而言,水平方向多字符,对于竖而言,竖直方向多字符
#include<iostream>
#include<algorithm>
using namespace std;
// 行
void showRow(int k,string n,int len,int flag){
for(int i=0;i<len;i++){
cout<<" ";
char c;
// 最上面一行
if(flag == 0 && (n[i]=='2' || n[i]=='3' || n[i]=='5' || n[i]=='6' || n[i]=='7' || n[i]=='8' || n[i]=='9' || n[i]=='0'))
c = '-';
// 中间一行
else if(flag == 2 && (n[i]=='2' || n[i]=='3' || n[i]=='4' || n[i]=='5' || n[i]=='6' || n[i]=='8' || n[i]=='9'))
c = '-';
// 最下面一行
else if(flag == 4 && (n[i]=='2' || n[i]=='3' || n[i]=='5' || n[i]=='6' || n[i]=='8' || n[i]=='9' || n[i]=='0'))
c = '-';
else
c = ' ';
for(int j=0;j<k;j++)
cout<<c;
cout<<" ";
if(i!=len-1)
cout<<" ";
}
cout<<endl;
}
// 竖
void showLine(int k,string n,int len,int flag){
for(int line = 0;line<k;line++){
for(int i=0;i<len;i++){
// 上面的竖前面的 |
if(flag == 1 && (n[i]=='4' || n[i]=='5' || n[i]=='6' || n[i]=='8' || n[i]=='9' || n[i]=='0'))
cout<<"|";
// 下面的竖前面的 |
else if(flag == 3 && (n[i]=='2' || n[i]=='6' || n[i]=='8' || n[i]=='0'))
cout<<"|";
else
cout<<" ";
for(int j=0;j<k;j++)
cout<<" ";
// 上面的竖后面的 |
if(flag == 1 && (n[i]=='1' || n[i]=='2' || n[i]=='3' || n[i]=='4' || n[i]=='7' || n[i]=='8' || n[i]=='9' || n[i]=='0'))
cout<<"|";
// 下面的竖后面的 |
else if(flag == 3 && (n[i]=='1' ||n[i]=='3' || n[i]=='4' || n[i]=='5' || n[i]=='6' || n[i]=='7' || n[i]=='8' || n[i]=='9' || n[i]=='0'))
cout<<"|";
else
cout<<" ";
if(i!=len-1)
cout<<" ";
}
cout<<endl;
}
}
int main(){
int k;
string n;
cin>>k>>n;
int len = n.length();
for(int i=0;i<5;i++){ // 五行的结构
if(i%2==0)
showRow(k,n,len,i);
else
showLine(k,n,len,i);
}
return 0;
}