基础82 密码分析

82 密码分析

作者: Turbo时间限制: 1S章节: 结构体

问题描述 :

密码分析学中常常需要统计字符出现的频度。给定若干行短文,要求按字符出现的频度由高到低输出,当两个字符出现的频度相同时,按字符大小的顺序输出。

注意:只需要统计英文字母的频度,非英文字母一律忽略。

输入说明 :

输入由多组数据组成。每组数据由一行长度不超过100的字符串组成,不区分字母大小写,如A与a看作同一个字母。

输出说明 :

对每组输入数据都有若干行输出,每行有两个输出数据,第一个数据为某个大写字母,第二个数据为该字母出现的频度,两个数据之间有一个空格。输出顺序按字母出现的频度由高到低输出,当两个字母的频度相同时,按字母大小的顺序输出。两组输出之间有一行空行。

输入范例 :
Do what you say, say what you do.
This is a test.
Count me 1 2 3 4 5.
输出范例 :
A 4
O 4
Y 4
D 2
H 2
S 2
T 2
U 2
W 2

S 3
T 3
I 2
A 1
E 1
H 1

C 1
E 1
M 1
N 1
O 1
T 1
U 1

#include<stdio.h>
#include<string.h>
#include<ctype.h>
struct freqent{
	char c;
	int count;
}fre[26];
int main(){
	int i,j,max,len,b[26]={0},flag;
	char str[101];
	for(i=0;i<26;i++){
        fre[i].c='A'+i;
		fre[i].count=0;
	}
	while(gets(str)){
		flag=1;
		len=strlen(str);
		for(i=0;i<len;i++)
			if(str[i]>='a'&&str[i]<='z') str[i]=toupper(str[i]);//统一转换成大写
        for(i=0;i<len;i++)
			if(str[i]>='A'&&str[i]<='Z') 	fre[str[i]-'A'].count++;
			i=0;
		while(flag){
			if(fre[i].count!=0&&b[i]==0){
				 max=i;
			     for(j=0;j<26;j++)
				 {	if(i!=j){
						if((fre[max].count<fre[j].count)&&b[j]==0){ max=j;}
						else if((fre[max].count==fre[j].count)&&b[j]==0)
						{
							if(fre[j].c<fre[max].c) {max=j;}
						}
					}
				 }
				 printf("%c %d\n",fre[max].c,fre[max].count);
				 b[max]=1;
				 for(j=0;j<26;j++) 
					 if((b[j]==0)&&(fre[j].count!=0)) break;
				 if(j==26) flag=0; //flag标记是否访问完所有不是0的元素
				 i++;
				 if(i==26) i=0;//循环
			}else{
				 i++;
				 if(i==26) i=0;//循环
			}  
		}
		 printf("\n");
		for(i=0;i<26;i++)
                b[i]=0;
		for(i=0;i<26;i++)
			fre[i].count=0;	
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值