我用C语言写了个实现香农编码的程序。但是最后实现码字的时候总是计算错误,请各位帮忙看看和改错。
ps:已经有半年没写过C了,链表啥的都忘光了,所以用数组来写。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int size = 5;
float q[size];int p[size];
int i;
//生成size个两位随机小数作为信源
srand(time(0));
for(i=0; i<size; i++){
p[i] = rand()%90+0;
}
printf("5个概率为:\n");
for(i=0; i<size; i++){
float t;
t=0.01*(p[i]%100);
q[i]=t;
printf("%.2f ", q[i]);
} printf("\n");
printf("从大到小排序后:\n");
for(i=0;i<size;i++){
int j;
for(j=i+1;j<size;j++){
float temp;
if (q[i]<=q[j]){
temp=q[i];
q[i]=q[j];
q[j]=temp;
}
}
}
for(i=0; i<size; i++){
printf("%.2f ", q[i]);
} printf("\n");
//****************************************************
//计算累加概率
float leijia[size+1];float leijia2[size+1];
leijia[0]=0.0;leijia2[0]=leijia[0];
printf("累加概率为:\n");
for (i=0;i<size;i++){
leijia[i+1]=leijia[i]+q[i];
printf("%.5f\t",leijia[i]);
}printf("\n");
for(i=1;i<size;i++){
leijia2[i]=leijia[i]-(int)leijia[i];
}
//****************************************************
//计算码字长度和输出码字
int mazicd[size];
for(i=0;i<size;i++){
double bds=-1*log10(q[i])/log10(2);
if(bds-(int)bds==0){
mazicd[i]=(int)bds;
}else{
mazicd[i]=(int)bds+1;
}
printf("码字长度为:%d\t",mazicd[i]);
printf("码字为:");
int k=0;char mz[20];
int temp=leijia2[i]*2;
for(k=0;k<mazicd[i];k++){
if(leijia[i]==0){
mz[k]=0;
printf("%d",mz[k]);
}else{
if(temp>=1){
mz[k]=1;
printf("%d",mz[k]);
}else{
mz[k]=0;
printf("%d",mz[k]);
}
}
}printf("\n");
}return 0;
}
