import java.util.Scanner;
import java.lang.Math;
public class shannan
public static void main(String args[])
int i,j;
float num=0.0f;
int m_n;
Scanner scan=new Scanner(System.in);
System.out.printf("编码符号个数为:");
m_n=scan.nextInt();
float m_p[]=new float[m_n];
float m_sp[]=new float[m_n];
float m_length[]=new float[m_n];
for(i=0;i<m_n;i++)
System.out.printf("第"+i+"个概率为:");
m_p[i]=scan.nextFloat();
num=num+m_p[i];
if(num!=1)
System.out.println("所输入的概率不为零");
else
//给概率排序//
for(i=0;i<m_n;i++)
for(j=i+1;j<m_n;j++)
if(m_p[j]>m_p[i])
float tmp=m_p[i];
m_p[i]=m_p[j];
m_p[j]=tmp;
}
m_sp[0]=0.0f;
for(i=0;i<m_n-1;i++)
m_sp[i+1]=m_p[i]+m_sp[i];
int k=i+1;
float a=(float)(-1.0/Math.log(2));
for(i=0;i<m_n;i++)
float inf=(float)(a*Math.log((double)m_p[i]));
m_length[i]=(int)inf;
if((float)m_length[i]<inf)
++m_length[i];
}
System.out.println("-=-=-=-=-=-=-\n香农编码结果:\n-=-=-=-=-=-=-\n");
System.out.printf("消息序号si 消息概率p(si) 累加概率Pi 代码组长度li 二进制代码组\n");
for(i=0;i<m_n;++i)
System.out.printf(i+1+"\t\t"+m_p[i]+"\t\t"+m_sp[i]+"\t"+m_length[i]+"\t\t");
double sum1;
sum1=0;
for (j=1;j<=m_length[i];j++)
sum1=sum1+(double)Math.pow(2,-j);
if(sum1>m_sp[i])
System.out.printf("0");
sum1=sum1-(double)Math.pow(2,-j);
else
System.out.printf("1");
System.out.printf("\n");
float H=0.0f;
float L=0.0f;
float H1,L1;
for(i=0;i<m_n;i++)
float b=(float) (Math.log(m_p[i]));
H1=m_p[i]*a*b;
H=H+H1;
L1=m_p[i]*m_length[i];
L=L1+L;
float w=H/L;
System.out.println("信源熵为:"+H);
System.out.println("平均码长为:"+L);
System.out.println("编码效率为:"+w);
}
}
}