Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:始终是Runtime Error,老哥们看看咋回事In Reply To:始终是Runtime Error,老哥们看看咋回事 Posted by:20162430428 at 2018-05-13 15:42:23 > #include <iostream> > #include <string> > using namespace std; > #define N 30 > int w[N]; > string text; > typedef struct{ > char ch; > int w,p,l,r; > }Node; > Node node[2*N]; > int L_code[N]; > > void Coding(int m); > void Coding(int m){ > int a,b; //记录当前权值最小两个节点的下标 > > //生成哈夫曼树 > for(int i=m+1;i<=2*m-1;i++) > { > //找到当前a,b > int min=INT_MAX,c; > for(int j=1;j<i;j++) > { > if(node[j].p==0 && node[j].w!=0) > { > if(node[j].w<min) > { > min=node[j].w; > a=j; > c=j; > } > } > } > min=INT_MAX; > for(int j=1;j<i;j++) > { > if(node[j].p==0 && node[j].w!=0 && j!=c) > { > if(node[j].w<min) > { > min=node[j].w; > b=j; > } > } > } > > node[a].p=i; node[b].p=i; > node[i].l=a; node[i].r=b; node[i].w=node[a].w+node[b].w; > > } > > } > void Length(int m); > void Length(int m){ > for(int i=1;i<=m;i++) > L_code[i]=0; > for(int i=1;i<=m;i++){ > int j; > j=i; > while(j!=2*m-1) //不是0,是2*m-1 > { > L_code[i]++; > j=node[j].p; //*** > } > } > > } > > int main(){ > while(cin>>text){ > if(text=="END") break; > //对w数组赋初值0 > for(int i=1;i<=27;i++) > w[i]=0; > char n,m=0; //n为每组文本长度,m为字符种类数 > n=text.length(); //或text.size(); > //统计文本中字符的权值 > for(int i=0;i<n;i++) > { > if(text[i]=='_') > w[27]++; > else > { > w[text[i]-'A'+1]++; > } > } > for(int i=1;i<=2*N;i++) > { > node[i].w =0; > node[i].p =0; > node[i].l =0; > node[i].r =0; > } > for(int i=1;i<=26;i++) > { > if(w[i]!=0) > { > m++; > node[m].ch = 'A'+i-1; > node[m].w=w[i]; > } > } > if(w[27]!=0) > { > m++; > node[m].ch = '_'; > node[m].w = w[27]; > } > //*****不要忘了m==1,即只有一种字符的特殊情况!!! > if(m==1) > { > printf("%d %d %.1f\n",8*node[1].w,node[1].w,8*1.0); > continue; > } > //*************初始化了叶节点 > > //编码 > Coding(m); > > //统计每个字符哈夫曼编码长度 > Length(m); > > int sum=0; > for(int i=1;i<=m;i++) > sum=sum+L_code[i]*node[i].w; > printf("%d %d %.1f\n",8*n,sum,(8*1.0*n)/(1.0*sum)); > //或double(n*8/sum) > } > > > > return 0; > } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator