【问题描述】
统计字符串里面哪个英文字母字符最多,并统计次数。
【输入形式】
第一行输入字符串。
【输出形式】
输出出现次数最多(相同则一起输出)的字符和次数,并用空格隔开。
【样例输入1】
asddfssaasswef
【样例输出1】
s 5
【样例输入2】
tomtomas
【样例输出2】
t 2
o 2
m 2
要求:要用到字符对应的ASCll码、数组
(希望给个完整的程序,有注释容易看懂,谢谢!)
代码如下:
#include <stdio.h>
int main()
{
int cnt[26] = {0};
int zm[26];
char buf[1000]={0};
int i,j,tmp;
scanf("%s",buf);
for(i=0;buf[i]!='\0';i++)
{
cnt[buf[i]-'a']++;
}
for(i=0;i<26;i++)
zm[i] = i;
//排序
for (i=0;i<25;i++)
{
for(j=0;j<25-i;j++)
{
if(cnt[j] < cnt[j+1])
{
tmp = cnt[j];
cnt[j] = cnt[j+1];
cnt[j+1] = tmp;
tmp = zm[j];
zm[j] = zm[j+1];
zm[j+1] = tmp;
}
}
}
//显示
printf("%c %d\n",zm[0]+'a',cnt[0]);
for(i=1;i<26;i++)
{
if(cnt[i] == cnt[0])
printf("%c %d\n",zm[i]+'a',cnt[0]);
else
break;
}
return 0;
}
可以创建一个长度为26的全零数组=>arr,然后遍历字符串,对每个字符的ascii码减去‘a'的ascii码得到=>index,然后对arr[index]++,最后输出arr中的最大值,并对其索引值加上'a'的ascii码得到原先字符。
代码如下,有帮助望采纳
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[10000]= {'\0'};
int i=0,num[26]= {0},max=0;
gets(s);
for(i=0; i<strlen(s); i++)
{
if(s[i]>='A' && s[i]<='Z') //大写转小写,题目没说大写算不算,我就默认不区分大小写了
{
s[i]+=32;
}
num[s[i]-97]++; //利用ASC码作为数组下标,使对应的数组元素值增加
} //第i个字母对应num[i-1],比如a对应num[0]
for(i=0; i<26; i++)
{
if(max<num[i]) //找数组num中的最大值
max=num[i];
}
for(i=0; i<26; i++)
{
if(max==num[i]) //输出num中的最大值,如果有同时最大的情况,则都会输出
{
printf("%c %d\n",97+i,max);
}
}
return 0;
}
你好同学!既要统计字母个数最多显示,也要保证原先字母顺序不乱【就是你的第二个示例】
我给出了我的代码,仅供参考,一起学习,mua
#include <stdio.h>
int main(){
int count[26], range[26], firstappear[26];
//count用来储存字母出现的个数:count[0]储存a字母个数,count[1]储存b字母个数,依次类推
char a[1000]; //假设输入字符串最多包含1000个字符,你可以自己根据要求修改
int i,j,temp, nfirstappear=0;
scanf("%s",&a);//输入字符串
for(i=0;i<26;i++)count[i]=0;//初始化count值为0
for(i=0;a[i]!='\0';i++){
//找到字符a[i]对应的是哪个字母,比如a[i]是A字母j=0, 如果是B字母,j=1依次类推
if(a[i]<='z' && a[i]>='a')j = a[i]-'a';//找大写字母对应的j值
else if(a[i]<='Z' && a[i]>='A')j = a[i]-'A';// 找小写字母对应的j值 (我这里考虑了大写字母你,可以改成只考虑小写字母只需要删除这行就行)
else continue;
count[j]++; //把对应的字母上的count值加1
// 计算第一次出现
if(count[j]==1){
firstappear[nfirstappear] = j; //计算第一次出现的顺序并记录
nfirstappear++;
}
}
//下面对字母出现个数进行排序
for(i=0;i<26;i++)range[i]=i; //初始顺序是从1到26的字母顺序,等下排序好追踪
for(i=0;i<26;i++)for(j=i+1;j<26;j++)if(count[i]<count[j]){
temp = count[i]; //调换顺序
count[i] = count[j];
count[j] = temp;
temp = range[i];
range[i] = range[j];
range[j] = temp;
}
//输出结果
// for(i=0;count[i]==count[0];i++) printf("%c %d\n", range[i]+'a', count[i]); //这个没有考虑字符串顺序输出结果,舍去
//现在考虑顺序输出
for(i=0;i<nfirstappear;i++){
for(j=0; j<26; j++){
if(count[j]==count[0] && firstappear[i]==range[j]) printf("%c %d\n", range[j]+'a', count[j]);//如果满足顺序要求且字母个数第一则先输出
}
}
return 0;
}
供参考:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int i,k,max_l,max_u;
int lett_l[26]={0};//小写字母
int lett_u[26]={0};//大写字母
char s[1024];
cout<<"输入字符串:"<<endl;
cin.getline(s,1024); //字符串输入
k = strlen(s);//取得字符串长度
for (i=0;i<k;i++)
{
if(s[i]>='a'&&s[i]<='z')
lett_l[s[i]-'a']++; //小写字母计数
else
if(s[i]>='A'&&s[i]<='Z')
lett_u[s[i]-'A']++; //大写字母计数
}
max_l=lett_l[0];max_u=lett_u[0];
for(i=0;i<26;i++) //找到次数最大值
{
if(lett_l[i] > max_l) max_l=lett_l[i];
if(lett_u[i] > max_u) max_u=lett_u[i];
}
for(i=0;i<26;i++)//输出统计结果
{
if(lett_u[i]==max_u && lett_u[i]!=0)
cout<<(char)('A'+i)<<" "<<lett_u[i]<<endl;
if(lett_l[i]==max_l && lett_l[i]!=0)
cout<<(char)('a'+i)<<" "<<lett_l[i]<<endl;
}
return 0;
}