首先要知道每个字符串都对应于一个ASCII编码,也就是码数不一样比如空格对应的ASCII十进中数为32,也就是first[32]的位置会存储的代表空格统计到的个数,然后32这个位置数按字符输出的话就是一个空格键,理解这个关键程序也就不难啦;
#include
#include
#define MAX_LEN 1000 //宏定义字符存储空间的长度
char s[MAX_LEN];//定义字符存储空间
int num[256] = { 0 }, first[256];//num存储每个字符的个数,first存储每个字符第一次出现的位置,在后面次数相同时,作为先输出用。
//根据统计次数多的先排,次数相等的最先出现的先排
int lessThan(char i, char j) { //传入两个字符的ASCII码
if (num[i] != num[j]) //判断两个字符统计的资料是否相等
return num[i] < num[j];//不相等,返回两个统计数比较
return first[i] > first[j]; //次数相等,看先那个字符最先出现
}
int main() {
int i, j, k; //定义循环临时变量
char tmp; //定义临时交换变量
fgets(s, MAX_LEN, stdin); //等待用户输入字符串
if (s[strlen(s) - 1] == '\n' || s[strlen(s) - 1] == '\r')
s[strlen(s) - 1] = '\0'; //消除输入字符串中的回车或换行符
for (i = 0; s[i] != '\0'; i++) {
num[s[i]]++; //统计字符出现的资料
if (num[s[i]] == 1) //存储字符第一次出现的位置
first[s[i]] = i;
}
for (i = 0; s[i] != '\0'; i++)
for (j = i + 1; s[j] != '\0'; j++)
if (lessThan(s[i], s[j])) {//根据lesThan判断这个字符是否要调换位置重新排序
tmp = s[i];
s[i] = s[j];
s[j] = tmp;
}
for (i = k = 0; s[i] != '\0'; i++) //准备输出
if (i == 0 || s[i] != s[i - 1]) {
k++;
printf("%c-%d%c", s[i], num[s[i]],
s[i + 1] == '\0' || k % 4 == 0 ? '\n' : ' ');
}
return 0;
}
让我用电脑给你回答.现在是手机.打字太慢了.