
精品文档交流
算术编码的 C++实现
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
#define N 50 //输入的字符应该不超过 50 个
struct L //结构用于求各字符及其概率
{
char ch; //存储出现的字符(不重复)
int num; //存储字符出现的次数
double f;//存储字符的概率
};
//显示信息
void disp();
//求概率函数,输入:字符串;输出:字符数组、字符的概率数组;返回:数组长度;
int proba(string str,char c[],long double p[],int count);
//求概率的辅助函数
int search(vector<L> arch,char,int n);
//编码函数,输入:字符串,字符数组,概率数组,以及数组长度;输出:编码结果
long double bma(char c[],long double p[],string str,int number,int size);
//译码函数,输入:编码结果,字符串,字符数组,概率数组,以及它们的长度;输出:字
符串
//该函数可以用于检测编码是否正确
void yma(string str,char c[],long double p[], int number,int size,long double input);
int main()
{
string str; //输入要编码的 String 类型字符串
int number=0,size=0; //number--字符串中不重复的字符个数;size--字符串长度
char c[N]; //用于存储不重复的字符
long double p[N],output; //p[N]--不重复字符的概率,output--编码结果
disp();
cout<<"输入要编码的字符串:";
getline(cin,str); //输入要编码的字符串
size=str.length(); //字符串长度
number=proba(str,c,p,size);//调用求概率函数,返回不重复字符的个数
cout.setf(ios::fixed); //“魔法配方”规定了小数部分的个数
cout.setf(ios::showpoint); //在此规定编码结果的小数部分有十个