#include<stdio.h> #include<math.h> //使用各種數(shù)學(xué)函數(shù) #define N 7 main() { int i,j; double p[N]={0},max,sum=0,R,H=0,K1=0,n; double q[N]={0};//概率數(shù)組 int length[N];//碼長數(shù)組 double K[N]={0},I[N]={0};//求碼長的中間數(shù)組 int a[N][N]={0};//二進制存儲數(shù)組 for (i=0;i<N;i++) scanf("%lf",&p[ i]); printf("\n"); //判斷輸入概率是否正確 for(i=0;i<N;i++) { sum+=p[ i]; } printf("概率之和=%lf\n",sum); printf("\n"); if(sum==1.000000) { printf("輸入概率p(i):\n"); for(i=0;i<N;i++) { printf("p[%d]=%lf\n",i,p[ i]); } printf("\n"); } else {printf("error\n");return 0;} //將概率進行排序操作 for(i=0;i<N;i++) { for(j=i+1;j<N;j++) { if(p[ i]<p[j]) { max=p[ i]; p[ i]=p[j]; p[j]=max; } } } //輸出排序后的數(shù)組 printf("排序:\n"); for(i=0;i<N;i++) { printf("p[%d]=%lf\n",i,p[ i]); } printf("\n"); //求累加概率 for(i=0;i<N;i++) { q[i+1]=q+p[ i];//從第二個開始加 } //輸出累加概率數(shù)組 printf("累加概率:\n"); for(i=0;i<N;i++) { printf("q[%d]=%lf\n",i,q); } printf("\n"); //求-logp(i) for(i=0,j=0;i<N;i++,j++) { K[j]=-log(p[ i])/log(2); } printf("-logp(i): \n"); for(j=0;j<N;j++) printf("-logp(%d)=%.2lf\n",j,K[j]); printf("\n"); //求碼字長度 for(i=0,j=0;i<N;i++,j++) { K[j]=-log(p[ i])/log(2); I[j]=K[j]+1; if(I[j]>(int)(I[j]))//香農(nóng)編碼的第三個步驟 length[j]=(int)I[j]; else length[j]=K[j]; K1+=p[ i]*length[j];//求平均碼長 } //輸出碼字長度 printf("碼長:\n"); for(i=0;i<N;i++) { printf("length[%d]=%d\n",i,length); } printf("\n"); //求累加概率的二進制形式,即碼字 for(i=0;i<N;i++) { for(j=0;j<length;j++) { q=q*2; if(q>=1) { q=q-1; a[j]=1; } else a[j]=0; } } //輸出碼字 printf("碼字:\n"); for(i=0;i<N;i++) { for(j=0;j<length;j++) printf("%d",a[j]); printf("\n"); } //求信源熵 編碼效率 for(i=0,j=0;i<N;i++,j++) { K[j]=-log(p[ i])/log(2); H+=p[ i]*K[j]; n=H/K1; } printf("H(x)=%.2lf,n=%lf",H,n); }
|