1. 程式人生 > >poj 百鍊 2800:垂直直方圖

poj 百鍊 2800:垂直直方圖

描述
輸入4行全部由大寫字母組成的文字,輸出一個垂直直方圖,給出每個字元出現的次數。注意:只用輸出字元的出現次數,不用輸出空白字元,數字或者標點符號的輸出次數。
輸入
輸入包括4行由大寫字母組成的文字,每行上字元的數目不超過80個。
輸出
輸出包括若干行。其中最後一行給出26個大寫英文字母,這些字母之間用空格隔開。前面的幾行包括空格和星號,每個字母出現幾次,就在這個字母的上方輸出一個星號。注意:輸出的第一行不能是空行。
樣例輸入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
樣例輸出
思路:這道題第一眼看上去輸入還好,就是輸出,讓人費解,這要怎麼輸出。其實很簡單。先用一個數組num[26]記錄每個字母出現的次數,然後比較大小求出現最多的次數。把這個最多次數當成接下來要輸出圖案的行數,然後迴圈並判斷這一行每個字母輸出*和一個空格或者兩個空格,每輸出一行,最大的次數都要減一,以進行下一行的判斷輸出。
需要注意字元陣列要開得大一點。
c語言程式碼:
#include<stdio.h>
#include <string.h>
int main()
{
 int num[26];
 int i,j;
    char str[20000];
 for(i=0;i<26;i++)
  num[i]=0;
    for (i=0;i<4;i++)
    {
   gets(str);
        int len = strlen(str);
        for (j=0;j<len;j++)
        {
            if (str[j]>='A'&&str[j]<='Z')
            {
                num[str[j]-'A']++;//記錄每個字母出現的次數
            }
        }
 }
    int max = 0;
    for (i=0;i<26;i++)
        if (num[i]>max)
            max = num[i];//求出出現最多的次數
  for (i=max;i>0;i--)//以出現最多的次數為行數的迴圈
  {
   for (j=0;j<26;j++)//每行26個字母迴圈判斷輸出
   {
    if (num[j]>=i)
     printf("* ");
    else
     printf("  ");
   }
   printf("\n");
  }
  printf("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n");
  return 0;
}