Hduoj1053 【哈夫曼编码】

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int cmp(const void *a, const void *b)
{
    return *(int *) b - *(int *) a;
}
int main()
{
    int i, j, k, n, t, a[30];
    char s[1001];
    while(gets(s))
    {
        if(strcmp(s,"END") == 0)
            break;
        int l = strlen(s);
        memset(a, 0, sizeof(a));
        for(i = 0; i < l; ++i)
        {
            if(s[i] == '_')
                a[0]++;
            else
                a[s[i] - 'A' +1]++;
        }
        qsort(a, 27, sizeof(a[0]), cmp);
        for(i = 0; ; ++i)
            if(a[i] == 0)
            break;
        k = i;
        n = 0;
        for(i = k-1; i > 0; --i)
        {
            a[i-1] += a[i];//每个字符的权值不断的往上加相应层数的次数,即权值乘以字符所在的层数,最后所有和相加
            n += a[i-1];    //因为每个字符所在的层数即为二进制编码的长度,接着乘以该字符出现的次数(即权值)得出来的便是该字符在字符串中的总位数。
            qsort(a, i, sizeof(a[0]), cmp);
        }
        if(k == 1)
            n = a[0];
        printf("%d %d %.1f\n", 8*l, n, (float)(8*l)/(float)n);
    }
    return 0;
}


题意:给出一个字符串,有2种编码方式,一种是ASCII编码以8位二进制编码一个字符,另一种是根据字符出现的次数来编码,也就是哈夫曼编码(是根据字符出现的次数进行建树,建立哈夫曼树以后即可知道字符的二进制位数,最后根据二进制位数统计字符串的位数),要求输出ASCII编码的字符串的位数和哈夫曼编码的位数,以及比例。

思路:这里用了不断向上求和的思想间接的求出了结果。

你可能感兴趣的:(Hduoj1053 【哈夫曼编码】)