法一:找到M,递减输出
找到最多次数M,依次递减输出相应字符和次数
#include<stdio.h>
int main()
{
char s[50];
int i = 0, j, A[26] = { 0 }, a[26] = { 0 };
从缓冲区输入字符串
while ((s[i++] = getchar()) != '?');
s[i - 1] = '\0';
int n = i;
统计大小写字母出现次数
for (i = 0; i < n; i++)
{
if (s[i] >= 'A' && s[i] <= 'Z')
A[s[i] - 'A']++;
}
for (i = 0; i < n; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
a[s[i] - 'a']++;
}
假定大写字母出现最多次数为M
int M = 0;
for (i = 0; i < 26; i++)
{
if (A[i] > M)
M = A[i];
}
//从M递减输出相应次数对应的字母
for (j = M; j > 0; j--)
{
for (i = 0; i < 26; i++)
{
if (A[i] == j)
printf("%c %d\n", 'A' + i, A[i]);
}
}
同上
for (i = 0; i < 26; i++)
{
if (a[i] > M)
M = a[i];
}
for (j = M; j > 0; j--)
{
for (i = 0; i < 26; i++)
{
if (a[i] == j)
printf("%c %d\n", 'a' + i, a[i]);
}
}
return 0;
}
法二:假定M,遍历找M输出
假定最大次数M,找到真的M,输出相关
#include<stdio.h>
int main()
{
char a[100];
int C[26] = { 0 }, c[26] = { 0 }, n = 0, i, j, M;
输入字符串
while ((a[n++] = getchar()) != '?');
a[n - 1] = '\0';
统计次数
for (i = 0; i < n; i++)
{
if (a[i] >= 'A' && a[i] <= 'Z')
C[a[i] - 'A']++;
if (a[i] >= 'a' && a[i] <= 'z')
c[a[i] - 'a']++;
}
for (i = 0; i < 26; i++) //共26个字母,循环26次
{
M = i;第i次假定i为最大数对应下标
for (j = 0; j < 26; j++) //遍历数组把最大数下标赋给M
{
if (C[j] > C[M])
M = j;
}
if (C[M]) //若M对应数字非0,输出相关
{
printf("%c %d\n", 'A' + M, C[M]);
C[M] = 0;
}
}
同上
for (i = 0; i < 26; i++)
{
M = i;
for (j = 0; j < 26; j++)
{
if (c[j] > c[M])
M = j;
}
if (c[M])
{
printf("%c %d\n", 'a' + M, c[M]);
c[M] = 0;
}
}
return 0;
}
法三:二维数组,数值与下标同时排序
ROW == 2的二维数组,一行次序,一行数字
注意:
#include<ctype.h>
#include<stdio.h>
#define COL 128
void sort(int a[][COL])
{
int flag, i, j, t;
for (i = 0; i < COL; i++)
{
flag = 1;
for (j = 1; j < COL - i; j++)
{
if (a[0][j - 1] < a[0][j])
{
t = a[0][j - 1];
a[0][j - 1] = a[0][j];
a[0][j] = t;
t = a[1][j - 1];
a[1][j - 1] = a[1][j];
a[1][j] = t;
flag = 0;
}
}
if (flag)
return;
}
}
int main()
{
char s[] = "5B3aA+4-HDEH5DH?";
int a[2][128] = { 0 };
for (int i = 0;i < 128; i++)
a[1][i] = i + 1;
for (int i = 0; i < strlen(s) - 1; i++)
{
if (isalpha(s[i]))
a[0][s[i]-1]++;
}
sort(a);
for (int i = 0; i <128; i++)
{
if (a[0][i])
printf("%c %d\n", a[1][i], a[0][i]);
}
return 0;
}
法四:qsort排序,三数组法输出
#include<ctype.h>
#include<stdio.h>
#include<string.h>
int cmp(const void* a, const void* b)
{
return *(int*)b - *(int*)a;
}
int main()
{
char s[] = "5B3aA+4-HDEH5DH?";
int a[128] = { 0 }, b[128] = { 0 }, c[128] = { 0 };
for (int i = 0; i < strlen(s) - 1; i++)
{
if (isalpha(s[i]))
{
a[s[i]]++;
b[s[i]]++;
}
}
qsort(a, 128, 4, cmp);
for (int i = 0; i < 128; i++)
{
for (int j = 0; j < 128; j++)
{
if (!c[j] && b[j] != 0 && a[i] == b[j])
{
c[j] = 1;
printf("%c %d\n", j, b[j]);
}
}
}
return 0;
}