图表
题目描述
给你一个字符串,请统计各个字符出现的个数,并使用字符打印一幅统计图表。
图表的格式是
x轴是字符,y轴是字符出现个数
x轴的字符为字符串中出现过的字符,并按字典顺序排列
y轴中的出现次数使用''表示。为了让图表不至于太长,一个''表示的数量要尽可能的大。
每行的行末不允许多余的空格。
输入
存在多个测试用例,处理到文件末尾。
每行一个只含英文大写字母的字符串,长度不超过1000。
输出
每行输出一个样例的结果,每个结果之后有一个空行。
样例输入
AABBCC
AAAABBBBCC
AABBBBDDDE
样例输出
ABC
**
ABC
*
**
ABDE
提示
第一个样例,ABC都是出现2次,所以我们可以用一个星号表示出现2次。
第二个样例的第一行坐标C的位置是行末,没有空格,是回车。ABC分别出现4,4,2次,所以使用一个星号表示出现2次
第三个样例没有C字符,所有没有C字符的统计信息。第1,2行的A字符位置是空格。
#include <stdio.h>
#include <string.h>
int gcd(int a,int b)
{
return b ? gcd(b,a%b):a;
}
int main()
{
int i,j,k,x=0,max,gao;
char str[1005];
while(scanf("%s",str)!=EOF)
{
int num[27] = {0};
int len = strlen(str);
gao = 0;
for(i = 0;i < len;i++)//1-A
{
num[str[i]-64]++;
max = num[str[i]-64];
}
for(i = 1;i < 26;i++)
{
if(num[i]==0)
continue;
max = gcd(num[i],max);
}
for(i = 1;i < 27;i++)
{
if(num[i]!=0)
num[i] /= max;
}
for(i = 1;i < 27;i++)
{
if(num[i] > gao)
gao = num[i];//最长一列
}
for(i = 1;i <= gao;i++)
{
for(j = 1;j <=26;j++)
{
if(num[j]==0)
continue;
else
{
if(i > gao-num[j])
printf("*");
else
{
x = 0;
for(k = j+1;k <= 26;k++)
{
if(num[j] > num[k])
x++;//计数
}
if(x == 26-j)
break;
else
printf(" ");
}
}
}
printf("\n");
}
for(i = 1;i < 27;i++)
{
if(num[i]==0)
continue;
else
printf("%c",i+64);
}
printf("\n\n");
}
return 0;
}
presentation error,哪里错了呀