轉載自:http://www.cnblogs.com/sineagle/p/8834470.html
總時間限制:
1000ms
內存限制:
65536kB
描述
你的一個朋友買了一臺電腦。他以前只用過計算器,因爲電腦的顯示器上顯示的數字的樣子和計算器是不一樣,所以當他使用電腦的時候會比較鬱悶。爲了幫助他,你決定寫一個程序把在電腦上的數字顯示得像計算器上一樣。
輸入
輸入包括若干行,每行表示一個要顯示的數。每行有兩個整數s和n (1 <= s <= 10, 0 <= n <= 99999999),這裏n是要顯示的數,s是要顯示的數的尺寸。
如果某行輸入包括兩個0,表示輸入結束。這行不需要處理。
輸出
顯示的方式是:用s個'-'表示一個水平線段,用s個'|'表示一個垂直線段。這種情況下,每一個數字需要佔用s+2列和2s+3行。另外,在兩個數字之間要輸出一個空白的列。在輸出完每一個數之後,輸出一個空白的行。注意:輸出中空白的地方都要用空格來填充。
樣例輸入
2 12345 3 67890 0 0
樣例輸出
-- -- -- | | | | | | | | | | | | -- -- -- -- | | | | | | | | | | -- -- -- --- --- --- --- --- | | | | | | | | | | | | | | | | | | | | | | | | --- --- --- | | | | | | | | | | | | | | | | | | | | | | | | --- --- --- ---
提示
數字(digit)指的是0,或者1,或者2……或者9。
數(number)由一個或者多個數字組成。
------------------------------------------------------------------------------------------------
參考的某PPT, 拿過來整理一下
一個計算器上的數字顯示單元,可以看作由以下編號從1 到7 的7 個筆畫組成:
那麼,我們可以說,數字8 覆蓋了所有的筆畫,數字7 覆蓋筆畫1、3 和6,而數字1覆蓋筆畫3、6。注意,每個筆畫都是由s 個’-‘或s 個’|’組成。
輸出時,先輸出第1 行,即整數n 中所有數字裏的筆畫1,然後輸出第2 行到第s+1 行,即所有數字的筆畫2 和筆畫3,接下來是第s+2 行,即所有數字的筆畫4,再接下來是第s+3行到2×s+2 行,,就是所有數字的筆畫 5 和筆畫6,最後的第2×s+3 行,是所有數字的筆畫7。如果某個數字d 沒有覆蓋某個筆畫m (m = 1…7),那麼,輸出數字d 的筆畫m 的時候,就應該都輸出空格;如果覆蓋了筆畫m,則輸出s 個’-‘或s 個’|’,這取決於筆畫m 是橫的還是豎的。
解題思路:由上思路,解決這道題目的關鍵,就在於如何記錄每個數字都覆蓋了哪些筆畫。實際上,如果我們記錄的是每個筆畫都被哪些數字覆蓋,則程序實現起來更爲容易。一個筆畫被哪些數字所覆蓋,可以用一個數組來記錄,比如記錄筆畫1 覆蓋情況的數組如下:
char n1[11] = {"- -- -----"};
其中,n1[i](i = 0……9) 代表筆畫1 是否被數字i 覆蓋。如果是,則n1[i] 爲'-',如果否,則n1[i]爲空格。上面的數組的值體現了筆畫1 被數字0, 2, 3, 5, 6, 7, 8, 9 覆蓋。
對於豎向的筆畫2,由字符 '|' 組成,則記錄其覆蓋情況的數組如下:
char n2[11] = {"| ||| ||"};
該數組的值體現了筆畫2 被數字0, 4, 5, 6, 8, 9 覆蓋。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
|
加註釋的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
|