⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xnbm.c

📁 香农编码程序
💻 C
字号:
#include<stdio.h>
#include<math.h>
#define n 100
main()
{ float p[n],pt[n],pt1[i],k[n],t;
   int i,j,k,b[n];
   printf("please input N:\n",N);  //输入信源消息符号个数
   scanf("%d",&N);
   for(i=0;i<N;i++)          //输入信源消息符号概率
   { printf("please input p[xi]:\n");
     scanf("p[%d]=%f",&i,&p[i]);
   }
   for(i=0;i<N-1;i++)    //将信源消息符号按其出现的概率从大到小排序
	for(j=i+1;j<N;j++)
	 if(p[i]<p[j])
	 { t=p[i];
	   p[i]=p[j];
	   p[j]=t;
	 }
   for(i=0;i<N;i++)        //确定整数码长
    for(j=0;;j++)
	{if(j>=-log(p[i])/log(2)&&j<-log(p[i])+1)
	   k[i]=j;
	}
   for(i=0;i<N;i++)    //计算第i个消息的累加概率
    for(k=0;k<i;k++)
	{pt[0]=0;
     pt[i]+=p[k];
	}
   for(i=0;i<N;i++)   //将累加概率转换成比码长多一位的二进制数的小数部分
	for(k=0;k<k[i]+1;k++)
	{pt1[i]=pt[i]*2;
      if(pt1[i]>=1)
	  {b[k]=1;
	   pt1[i]=pt[i]-1;
	  }
      else
       b[k]=0;
	} 
  for(i=0;i<N;i++)   //输出信源消息符号所对应的二进制编码
  for(k=0;k<k[i];k++)
   printf("the code of sign x%d is %d:\n",i,b[k]);
}
      


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -