XTU OJ 1217 Diagram

我不是不写注释,我写起注释来真的很疯狂....

现在偶尔也会写写,这题真的是掰开揉碎了写的,里面能学到很多东西,很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;
} 

(最后再心疼一下当时背虐到死去活来的我)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值