顯示器(poj2754)

轉載自: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

//2018年4月14日18:10:25

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

 

char n1[11]={"- -- -----"};

char n2[11]={"|   ||| ||"};

char n3[11]={"|||||  |||"};

char n4[11]={"  ----- --"};

char n5[11]={"| |   | | "};

char n6[11]={"|| |||||||"};

char n7[11]={"- -- -- --"};

 

 

int main(){

    int s;

    char szNumber[20];

    int nDigit, nLength, i, j, k;

    while(1){

        scanf("%d%s", &s, szNumber);

        if(s == 0) break;

        nLength = strlen(szNumber);

        for(int i=0; i<nLength; i++){

            nDigit = szNumber[i] - '0';

            printf(" ");

            for(int j=0; j<s; j++)

                printf("%c", n1[nDigit]);

            printf("  ");

        }

        printf("\n");

        for(int i=0; i<s; i++){

            for(int j=0; j<nLength; j++){

                nDigit = szNumber[j] - '0';

                printf("%c", n2[nDigit]);

                for(int k=0; k<s; k++)

                    printf(" ");

                printf("%c ", n3[nDigit]);

            }

            printf("\n");

        }

        for(int i=0; i<nLength; i++){

            printf(" ");

            nDigit = szNumber[i] - '0';

            for(int j=0; j<s; j++)

                printf("%c", n4[nDigit]);

            printf("  ");

        }

        printf("\n");

        for(int i=0; i<s; i++){

            for(int j=0; j<nLength; j++){

                nDigit  = szNumber[j] - '0';

                printf("%c", n5[nDigit]);

                for(int k=0; k<s; k++)

                    printf(" ");

                printf("%c ", n6[nDigit]);

            }

            printf("\n");

        }

        for(int i=0; i<nLength; i++){

            printf(" ");

            nDigit = szNumber[i] - '0';

            for(int j=0; j<s; j++)

                printf("%c", n7[nDigit]);

            printf("  ");

        }

        printf("\n\n");

     

     

    }

     

    return 0;

}

 

加註釋的

 

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

#include <stdio.h>

#include <string.h>

char n1[11]={"- -- -----"};//筆畫1 被數字0,2,3,5,6,7,8,9 覆蓋

char n2[11]={"|   ||| ||"};//筆畫2 被數字0,4,5,6,8,9 覆蓋

char n3[11]={"|||||  |||"};//筆畫3 被數字0,1,2,3,4,7,8,9 覆蓋

char n4[11]={"  ----- --"};//筆畫4 被數字2,3,4,5,6,8,9 覆蓋

char n5[11]={"| |   | | "};//筆畫5 被數字0,2,6,8覆蓋

char n6[11]={"|| |||||||"};//筆畫6 被數字0,1,3,4,5,6,7,8,9 覆蓋

char n7[11]={"- -- -- --"};//筆畫7 被數字0,2,3,5,6,8,9 覆蓋

int main(void)

{

    int s;

    char szNumber[20];

    int nDigit , nLength, i , j , k;

    while(1)

    {

        scanf"%d%s", &s, szNumber);

        if (s == 0)

            break;

        nLength = strlen(szNumber);

        for (i = 0 ; i < nLength ; i++)

        {   //輸出所有數字的筆畫1

            nDigit = szNumber[i] - '0';

            printf(" ");

            for (j = 0 ; j < s ; j++) //一個筆畫由s 個字符組成

                printf("%c", n1[nDigit]);

            printf("  ");//兩個空格

        }

        printf("\n");

        for (i = 0 ; i < s ; i++)

        //輸出所有數字的筆畫2 和筆畫3

            for (j = 0 ; j < nLength ; j++)

            {

                nDigit = szNumber[j] - '0';

                printf("%c", n2[nDigit]);

                for (k = 0 ; k < s ; k++)

                    printf(" "); //筆畫2 和筆畫3 之間的空格

                printf("%c ", n3[nDigit]);//有一個空格

            }

            printf("\n");

        }

        for (i = 0 ; i < nLength ; i++)

        {   //輸出所有數字的筆畫4

            printf(" ");

            nDigit = szNumber[i] - '0';

            for (j = 0 ; j < s ; j++)

                printf("%c", n4[nDigit]);

            printf("  ");//兩個空格

        }

        printf("\n");

        for (i = 0 ; i < s ; i++)

        {   //輸出所有數字的筆畫5 和筆畫6

            for (j = 0 ; j < nLength ; j++)

            {

                nDigit = szNumber[j] - '0';

                printf("%c", n5[nDigit]);

                for (k = 0 ; k < s ; k++)    printf" "); //筆畫5 和筆畫6 之間的空格

                printf("%c ", n6[nDigit]);//有一個空格

            }

            printf("\n");

        }

        for (i = 0 ; i < nLength ; i++)

        //輸出所有數字的筆畫7

            printf(" ");

            nDigit = szNumber[i] - '0';

            for (j = 0 ; j < s ; j++)       printf("%c", n7[nDigit]);

            printf("  ");//兩個空格

        }

        printf("\n");      printf("\n");

    }

    return 0;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章