⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 算术编码.cpp

📁 比较简单的行程编码的小程序
💻 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 + -