10008 - What's Cryptanalysis?

题目大意:

题目原文:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&page=show_problem&problem=949

题目是要计算所给的文字中计算出各个字母的数量,然后按从大到小的顺序输出,如果数量相同的按字母顺序排列。数量是0的不用输出。

题目只需要逐个记录输入的字符并计数就可以了。。。输入开头的数字代表的是接下来有几行,但是这几行的字符都是一起统计的,所以可以直接读入字符,并不需要管他有几行。 直接使用while(scanf("%c",&c)!=EOF)循环来逐个读入字符。用一个包含一个大写字母和一个数字的结构体数组来保存数量。按顺序表示好A-Z之后,输入的字符如果是大写字符,减去'A'字符得到结构体数组的编号(从0开始的),小写字符要减'a'。

输出的时候从0开始逐一检索找出最大值,如果有数量相等的要取前面的字母先输出。每输出完一个要把当前字母的数据变为0;输出结束的标志是找到的最大值为0,说明全部都已经输出完成了。

附上代码:

View Code
 1 #include<stdio.h>
 2 struct al
 3 {
 4  int n;
 5  char alph;       
 6 };
 7 int main()
 8 {
 9  struct al a[26];
10  char c;
11  int i,maxi,bo;
12  for(i=0;i<26;i++)
13  {
14   a[i].n=0;
15   a[i].alph=i+'A';//初始化结构体 
16  }
17  while(scanf("%c",&c)!=EOF)
18  {
19   if(c>='A'&&c<='Z')//大写字母 
20   {
21    a[c-'A'].n++;                                    
22   }
23   else if(c>='a'&&c<='z')//小写字母 
24   {
25    a[c-'a'].n++;
26   } 
27  }
28  maxi=0;
29  bo=0;
30  while(1)
31  {
32   for(i=1;i<26;i++)
33   {
34    if(a[maxi].n<a[i].n) maxi=i;//找出最大值的编号 
35   }
36   if(a[maxi].n!=0)
37   {
38    printf("%c %d\n",a[maxi].alph,a[maxi].n);
39    a[maxi].n=0;//输出数据后重新初始化 
40    maxi=0;
41   }
42   else break;//最大值等于0的时候结束输出 
43  }
44  return 0;
45 }

 

posted on 2013-02-13 13:30  T^T  阅读(280)  评论(0编辑  收藏  举报

导航