图表
题目描述
给你一个字符串,请统计各个字符出现的个数,并使用字符打印一幅统计图表。
图表的格式是
- x轴是字符,y轴是字符出现个数
- x轴的字符为字符串中出现过的字符,并按字典顺序排列
- y轴中的出现次数使用'*'表示。为了让图表不至于太长,一个'*'表示的数量要尽可能的大。
- 每行的行末不允许多余的空格。
输入
存在多个测试用例,处理到文件末尾。
每行一个只含英文大写字母的字符串,长度不超过1000。
输出
每行输出一个样例的结果,每个结果之后有一个空行。
样例输入
AABBCC AAAABBBBCC AABBBBDDDD
样例输出
*** ABC ** *** ABC * ** *** **** ABDE
提示
第一个样例,ABC都是出现2次,所以我们可以用一个星号表示出现2次。
第二个样例的第一行坐标C的位置是行末,没有空格,是回车。ABC分别出现4,4,2次,所以使用一个星号表示出现2次
第三个样例没有C字符,所有没有C字符的统计信息。第1,2行的A字符位置是空格。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int zui(int a,int b)//计算最大公约数
{
int t;
if(a<b)
{
t=b;
b=a;
a=t;
}
while(a%b!=0)
{
t=a%b;
a=b;
b=t;
}
return b;
}
int main()
{
char o[1003];
while(scanf("%s",o)!=EOF)
{
int a,max,c,i,j=0,k,lengs;
lengs=strlen(o);
int p[100]= {0};
char q[100];
for(i=0; i<lengs; i++)
{
p[o[i]]++;//存储对应的字符有几个
}
for(i=65; i<91; i++)
{
if(p[i]>0)//存储有几个不同的字符
{
q[j]=(char)i;
j++;
}
}
if(j==1)
{
a=p[q[j-1]];//如果只有一个字符就把不要计算公约数了
}
else if(j==2)
a=zui(p[q[j-2]],p[q[j-1]]);//两个字符公约数的计算
else
{
a=zui(p[q[0]],p[q[1]]);//如果字符种类超过两个,则用下面这个方法
for(i=2; i<j; i++)//求多个数的公约数,就类似于先求两个的,再拿后面的数与之前的公约数求
{
a=zui(p[q[i]],a);
}
}
for(i=0; i<j; i++)//使得*表示最大的值
{
p[q[i]]=p[q[i]]/a;
}
max=p[q[0]];
for(i=1; i<j; i++)//找到最大的y轴的值
{
if(p[q[i]]>max)
{
max=p[q[i]];
}
}
c=0;
int li=max;
for(i=0; i<li; i++)//如果没输出到最后一个*时,就输出空格
{
for(k=0; k<j; k++)//标记最后一个*的位置
{
if(p[q[k]]==max)
{
c=k;
}
}
for(k=0; k<j; k++)//输出*或者空格
{
if(p[q[k]]==max)
{
printf("*");
p[q[k]]--;
}
else if(k<=c)
{
printf(" ");
}
}
max--;//每次输出完一行,就将输出过的字符的数量减一
printf("\n");
}
for(i=0; i<j; i++)
{
printf("%c",q[i]);
}
printf("\n");
printf("\n");//注意题目要求,容易报pe
}
return 0;
}
有点冗杂,也没有去修改,纯暴力。