题目链接:http://poj.org/problem?id=2136
题意不难理解,就是输入四行字符串(每行字符总数不超过72个),统计26个英文字母的数目,并按柱状图的形式输出。我的思路就是,先用一维数组total[]统计每个英文字母的个数,接着找出最大的频率,保存在max中;紧接着用一个二维数组word[][](这个比较关键)记录每一个字母在0~max中是否存储数据,有的话则置1,没有则为0。(假如:字母'A'的频率是2,max = 10,那么word[0][0] = 0, word[0][1] = 1, word[0][2] = 1, word[0][3] = 0......word[0][10] = 0,代表)接着用两重循环输出表格即可。
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 using namespace std; 5 6 const int maxn = 30; 7 8 int main() 9 { 10 char s[100]; 11 int i, j, n, len, max, total[maxn], word[maxn][100]; 12 n = 4; 13 memset(total, 0, sizeof(total)); 14 while (n--) 15 { 16 gets(s); 17 len = strlen(s); 18 for (i = 0; i < len; i++) 19 { 20 total[s[i]-'A']++; // 统计每个字母出现的次数(total[0]对应'A',total[1]对应'B',依此类推) 21 } 22 } 23 max = total[0]; 24 for (i = 0; i <= 25; i++) 25 { 26 if (max < total[i]) // 在所有字母中找出最大的出现次数 27 max = total[i]; 28 } 29 memset(word, 0, sizeof(word)); 30 for (i = 0; i <= 25; i++) 31 { 32 for (j = 1; j <= total[i]; j++) 33 { 34 word[i][j] = 1; // 标记每个字母出现的数目 35 } 36 } 37 for (i = max; i > 0; i--) 38 { 39 for (j = 0; j <= 25; j++) 40 { 41 if (!word[j][i] && j == 0) 42 { 43 printf(" "); 44 } 45 else if (word[j][i] && j == 0) 46 printf("*"); 47 else if (!word[j][i]) 48 printf(" "); 49 else if (word[j][i]) 50 printf(" *"); 51 } 52 printf("\n"); 53 } 54 for (i = 0; i <= 25; i++) 55 { 56 if (i == 0) 57 printf("%c", i + 'A'); 58 else 59 printf(" %c", i + 'A'); 60 } 61 printf("\n"); 62 return 0; 63 }