我不是不写注释,我写起注释来真的很疯狂....
现在偶尔也会写写,这题真的是掰开揉碎了写的,里面能学到很多东西,很nice的一道题,但是当时作为小白就自己一个人硬想卡了好久...导致现在还没AK(血泪的教训了)
发上来做怀念之用了吧!
//首先对字符串进行输入(放入数组储存),然后遍历所有进行计数,num(s[i]-'A')++
//接着找到26个字母的最大公因数使‘*’效率最高,最后进行输出,输出时应注意从最大开始输出
//然后不断减去最大公因数,使输出的时候既不遗漏也不重复,换行时应换两行。
//另:当num[i]==0时应 continue跳过,不用输出;
#include<stdio.h>
#include<string.h>
char s [1005];
int num[30];
int Gcd(int x,int y){ return y ? Gcd(y , x % y) : x ; }//求最大公因数函数;
int max(int x,int y){ return ( x > y) ? x : y ;} //比大小函数;
void initalizer()
{
memset(num,0,sizeof(num));
}
void count() {
int n=strlen(s);
for(int i=0;i<n;i++){//此处存放从第0开始,因此循环应为<n;
if(s[i]) num[s[i]-'A']++;}//计算每个字母的个数;
//另:这里-‘A’也是从第0开始计数;
}
void output(){
int space=0;
int m=num[0];
int t=num[0];//这里定义了[0],因此循环从1开始并<26;
for(int c=1;c<26;c++){
t=max(t,num[c]);//n为数量最多的字母 ;
m=Gcd(m,num[c]);//m为每次变化的量(即最大公因数) ;
}
for(int j=t;j;j-=m){
for(int i=0;i<26;i++){
if(num[i]==0) continue ;
else if(num[i]>=j)
{
while(space)
{
printf(" ");
space--;
}
printf("*");
}
else space ++;
}
printf("\n");
space=0;
}
for(int i=0;i<26;i++){
if(num[i]) printf("%c",'A'+i);
}
printf("\n");
printf("\n");
}
int main()
{
while (scanf("%s",s)==1){
initalizer();
count();
output();
}
return 0;
}
(最后再心疼一下当时背虐到死去活来的我)