记录一下一次性AC的普及-(菜菜)
题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过 100100 个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过 100100 个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入输出样例
输入
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG. THIS IS AN EXAMPLE TO TEST FOR YOUR HISTOGRAM PROGRAM. HELLO!
输出
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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
说明/提示
每行输出后面不允许出现多余的空格。
难点 :不出现多余空格
分析
1.输入字符串
2.统计出现次数
3.排序(为后面不出现多余空格做准备)
4.遍历 是本行最后一个(最高)就给后一个元素赋值 等输出到它就换行
5.给ch[ ][ ]里输入*
6.输出 注意不要有多余空格
AC代码
#include <bits/stdc++.h>
using namespace std;
int i, j, a[26], A[26]; //a[]存出现次数,A[]存字母(后面要排序)
char ch[26][401]; //开题目理论最大
string s;
int main(){
for (i = 0; i < 26; i++) { //初始化
for (j = 0; j < 401; j++) {
ch[i][j] = ' ';
}
}
for (i = 0; i < 26; i++)
A[i] = 'A' + i;
for (i = 0; i < 4; i++) {
getline(cin, s);
for (j = 0; j < s.size(); j++) {
if (s[j] >= 'A' && s[j] <= 'Z')
a[s[j] - 'A']++;
}
}
int tmp; //冒泡排序 从大到小
for (i = 0; i < 26; i++) {
for (j = i + 1; j < 26; j++) {
if (a[i] < a[j]) {
tmp = a[i]; a[i] = a[j]; a[j] = tmp;
tmp = A[i]; A[i] = A[j]; A[j] = tmp;
}
}
}
int MAX = a[0]; //形成char图表
for (i = 0; i < 26; i++) {
for (; a[i] >= 0; a[i]--) {
ch[A[i]-'A'][MAX - a[i]] = '*';
}
}
int last;
for (j = 0; j < MAX - 1; j++) {
for (i = 0; i < 26; i++) {
if (ch[i][j] == '*')
last = i;
}
ch[last + 1][j] = 2;
}
for (j = 0; j <= MAX - 1; j++) { //输出*
int flg = 0;
for (i = 0; i < 26; i++) {
if (ch[i][j] == 2)
{break;}
if (flg == 1)
cout << " " << ch[i][j];
if (flg == 0) {
cout << ch[i][j];
flg = 1;
}
}
cout << endl;
}
for (i = 0; i < 25; i++) { //输出最后一行字母
cout << char('A' + i) << " ";
}
cout << "Z";
}