题目

蒜头君有一块数码管显示屏,只能显示数字。

每个数字的显示如下。

<math> <semantics> <mrow> <mn> 7 </mn> </mrow> <annotation encoding="application&#47;x&#45;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&#47;x&#45;tex"> k(1 \le k \le 10, 0 \le n \le 99999999) </annotation> </semantics> </math>k(1k10,0n99999999),分别表达放大的倍数和需要输出的数字。

输出格式

输出数码管显示的数字,数字每一位之间用一列空格隔开。

样例输入

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;
}

返回目录,查看更多