📄 算术编码.cpp
字号:
/*************************************************************
多媒体作业- 算术编码程序
编写人:杨润强
日期:2004.11.16
****************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 80
bool check(int *t,int f)//判断后面是否还有1
{
int i;
for(i=f;i<10;i++)
if(t[i]==1)
return true;
return false;
}
void result(int *t,int *y,int f)//得到结果
{
int i;
for(i=0;i<=f;i++)
t[i]=y[i];
}
void dtob(int *t,float flag)//十进制小数转换到二进制,并将小数部分存入一个数组
{
int i;
for(i=0;i<10;i++)
{
flag=flag*2;
if(flag<1)
t[i]=0;
else
{
flag=flag-1;
t[i]=1;
}
}
}
void main()
{
char s[MAX];
int a[MAX];
int b[MAX];
int r[MAX]={0};
register float zero,one,tempa=1.00000,tempb=0.00000,len;
int i=0,j=0;
printf("输入字符传:");
gets(s);
printf("输入0的概率:");
scanf("%f",&zero);
printf("输入1的概率:");
scanf("%f",&one);
for(i=0;i<int(strlen(s));i++)
{
if(s[i]!='0'&&s[i]!='1')
{
printf("串含有非0|1符号!\n");
exit(0);
}
if(s[i]=='0')
{
len=(tempa-tempb)*(1-zero);
tempa=tempa-len;
}
else
{
len=(tempa-tempb)*one;
tempb=tempb+len;
}
}
dtob(a,tempa);
dtob(b,tempb);
for(i=0;i<10;i++)
{
if(a[i]==b[i])
continue;
else
if(check(a,i))
{
result(r,a,i);
break;
}
else
{
while(b[i]==1)
{
i++;
break;
}
result(r,b,i);
}
}
for(i=0;i<10;i++)
{
printf("%d",a[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
printf("%d",b[i]);
}
printf("\n");
for(i=0;i<10;i++)
{
printf("%d",r[i]);
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -