POJ_1102 LC-Display

問題
数字と表示サイズがあたえられるので、電卓とかのディスプレイ風にして出力せよ。
例)
INPUT:
2 12345
3 67890
0 0
OUTPUT:

      --   --        --  
   |    |    | |  | |    
   |    |    | |  | |    
      --   --   --   --  
   | |       |    |    | 
   | |       |    |    | 
      --   --        --  

 ---   ---   ---   ---   ---  
|         | |   | |   | |   | 
|         | |   | |   | |   | 
|         | |   | |   | |   | 
 ---         ---   ---        
|   |     | |   |     | |   | 
|   |     | |   |     | |   | 
|   |     | |   |     | |   | 
 ---         ---   ---   --- 

解法
テーブル作ると便利。

#include <cstdio>
#include <cstring>
using namespace std;
char num[50];
int m_len; //numの文字列の長さ
int S;
const char N[10][7] = {
	{1,0,1,1,1,1,1}, //0
	{0,0,0,0,1,0,1}, //1
	{1,1,1,0,1,1,0}, //2
	{1,1,1,0,1,0,1}, //3
	{0,1,0,1,1,0,1}, //4
	{1,1,1,1,0,0,1}, //5
	{1,1,1,1,0,1,1}, //6
	{1,0,0,0,1,0,1}, //7
	{1,1,1,1,1,1,1}, //8
	{1,1,1,1,1,0,1}  //9
	};

void print_H(int p, int n){
	// '-'を表示しよう
	printf(" ");
	for(int j = 0; j < S; j++){
		if(N[n][p] == 1)
			printf("-");
		else
			printf(" ");
	}
	printf(" ");
}
void print_V(int p, int n){
	// '|'を表示しよう
	if(N[n][p] == 1) printf("|");
	else printf(" ");
	for(int i = 0; i < S; i++) printf(" ");
	if(N[n][p+1] == 1) printf("|");
	else printf(" ");
}
int main(){
	int m;
	while(scanf("%d %d", &S, &m) && S){
		sprintf(num, "%d", m);
		m_len = strlen(num);
		for(int i = 0; i < 2 * S + 3; i++){
			for(int p = 0; p < m_len; p++){
				int t = num[p] - '0'; //表示しようとする数
				if(i == 0)
					print_H(0, t);
				else if(i == S + 1)
					print_H(1, t);
				else if(i == 2 * S + 2)
					print_H(2, t);
				else{
					if(0<i && i<S+1)
						print_V(3, t);
					else 
						print_V(5, t);
				}
				printf(" ");
			}
			printf("\n");
		}
		printf("\n");
	}
	return 0;
}