#include "stdio.h"
#include "math.h"
#include "string.h"
#include "malloc.h"
#define null 0
#define DELTA 1e-6
#define log2(e) 1.442
main()
{
float *p,*F,*FF,*temp;
float sum=0.0,l_p;
int n,t_p;
int *l,i,j;
char **cd;
printf("n=");
scanf("%d",&n);
p=(float*)calloc(n+1,sizeof(float));
F=(float*)calloc(n+1,sizeof(float));
FF=(float*)calloc(n+1,sizeof(float));
temp=(float*)calloc(n+1,sizeof(float));
l=(int*)calloc(n+1,sizeof(int));
p[0]=(float)n;
F[0]=0.0;
FF[0]=0.0;
temp[0]=0.0;
l[0]=n;
printf("%d p:\n",n);
for(i=1;i<=l[0];i++)
scanf("%f",&p[i]);
for(i=1;i<=l[0];i++)
sum+=p[i];
if(fabs(sum-1.0)>DELTA)
printf("invalid input data\n");
for(i=1;i<=l[0];i++) {
l_p=-(log2(e)*log(p[i]));
l[i]=(int)ceil(l_p)+1;
}
cd=(char**)calloc(l[0]+1,sizeof(char*));
cd[0]=null;
for(i=1;i<=l[0];i++) {
cd[i]=(char*)calloc(l[i]+1,sizeof(char));
cd[i][l[i]]='\0';
}
for(i=1;i<=l[0];i++)
F[i]=F[i-1]+p[i];
for(i=1;i<=l[0];i++)
FF[i]=F[i]-0.5*p[i];
for(i=1;i<=l[0];i++) {
temp[i]=FF[i]*2;
for(j=1;j<=l[i];j++) {
t_p=(int)(temp[i]);
temp[i]=temp[i]-t_p;
if(t_p==0)
cd[i]=strcat(cd[i],"0");
else
cd[i]=strcat(cd[i],"1");
temp[i]=temp[i]*2;
}
}
printf("p is:");
for(i=1;i<=l[0];i++)
printf("%.3f ",p[i]);
printf("\n");
printf("F is:");
for(i=1;i<=l[0];i++)
printf("%.3f ",F[i]);
printf("\n");
printf("FF is:");
for(i=1;i<=l[0];i++)
printf("%.3f ",FF[i]);
printf("\n");
printf("S.F.E coding is:\n");
for(i=1;i<=l[0];i++)
printf("%.3f coding:%s\n",p[i],cd[i]);
for(i=n;i>=0;i--)
free(cd[i]);
free(cd);
free(p);
free(F);
free(FF);
free(temp);
}