当前位置: 代码迷 >> 综合 >> XTU OJ 1217 Diagram
  详细解决方案

XTU OJ 1217 Diagram

热度:78   发布时间:2023-12-04 21:53:45.0

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

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

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