| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2078 人关注过本帖
标题:关于ASCII压缩算法问题
只看楼主 加入收藏
hu_sir
Rank: 1
等 级:新手上路
帖 子:208
专家分:0
注 册:2004-4-29
收藏
 问题点数:0 回复次数:8 
关于ASCII压缩算法问题

最近《算法设计与分析》课程留了一个作业: 关于ascii压缩: ascii压缩方法是一种经过两级压缩之后可以减少62.5%存储空间的对村数据进行压缩的技术,其压缩过程如下: (1)将原来数据的每两位数字作为一组,各组的值在00-99之间;然后将他们转换成16进制,即00-99分别对应于00H-63H,并将其与ASCII字符进行映射,也即将00-99分别映射成CHR(00H)-CHR(63H)。显然,经过这一次压缩之后,数据压缩量为50%。 (2)因为字符CHR(00H)-CHR(63H)共有100个,且他们的最高位都为0,因此,每一组字符实际上是用7个二进制位表示即可。这样,又可以压缩掉1/8的信息量,即总共可以压缩掉62.5%的信息量。 例:用ASCII压缩方法对16个数字的压缩过程如下: 原始数字(16个ASCII码):1 2 3 4 5 6 7 8 9 1 9 2 9 3 9 4 分组:12 34 56 78 91 92 93 94 第一次压缩(8个ASCII码):0C 22 38 4E 5B 5C 5D 5E 第二次压缩(7个ASCII码):将第八个十六进制数据5E即01011110的低7位的7个二进制位分别填入第1-7个16进制数据的最高位(第八位),最后压缩结果为7个ASCII码字符: 8C 22 B8 CE DB DC 5D ============================= 下面是我编的一个压缩程序(为方便解压,我加了一位奇偶判别位) 请高人指点:(能否改成用类来实现?忘指点!) ============================= //输入字符格式:1 2 3 4 5 // #include <iostream.h> #include <stdio.h> #include <math.h> void main() { int k=0; int a[7]; cout<<"input numbers:"<<endl; char c1,c2; while((c1=getchar())!=10) //接收前一个字符 { c2=getchar(); //消除空格 int n; if(c2!=10) { c2=getchar(); //接收下一个字符 n=(c1-'0')*10+(c2-'0'); k++; if(k<8) { a[k-1]=n; } else { k=0; int b,c; for(c=2;c<=8;c++) { b=pow(2,8-c); b=n&b; b=b<<(c-1); a[c-2]+=b; if(a[c-2]>15) printf("%X",a[c-2]); else printf("0%X",a[c-2]); }

} c2=getchar(); if(c2==10) { for(int x=0;x<k;x++) { if(a[x]>15) printf("%X",a[x]); else printf("0%X",a[x]); } cout<<"0"<<endl; printf("\n"); break; } } else //接收奇数个字符 { n=(c1-'0')*10; k++; if(k<8) { a[k-1]=n; for(int x=0;x<k;x++) { if(a[x]>15) printf("%X",a[x]); else printf("0%X",a[x]); } } else { k=0; int bb,cc; for(cc=2;cc<=8;cc++) { bb=pow(2,8-cc); bb=n&bb; bb=bb<<(cc-1); a[cc-2]+=bb; if(a[cc-2]>15) printf("%X",a[cc-2]); else printf("0%X",a[cc-2]); }

} cout<<"1"<<endl; printf("\n"); break; } } }

搜索更多相关主题的帖子: ASCII 算法 压缩 CHR ascii 
2005-05-18 13:20
darrenchao
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-5-18
收藏
得分:0 
您好我是一名刚学C语言的 可不可以帮我看看这道题怎么做啊 我想了很久就是做不出来啊 谢谢 !!!!!!!!

Description

假设x是一个正整数,它的值不超过65535(即1< x<=65535),请编写一个程序,将x分解为若干个素数的乘积。

Input

输入的第一行含一个正整数k (1<=k<=10),表示测试例的个数,后面紧接着k行,每行对应一个测试例,包含一个正整数x。

Output

每个测试例对应一行输出,输出x的素数乘积表示式,式中的素数从小到大排列,两个素数之间用“*”表示乘法。

Sample Input

2119828

Sample Output

112*2*3*3*3*7*13
2005-05-18 15:48
hu_sir
Rank: 1
等 级:新手上路
帖 子:208
专家分:0
注 册:2004-4-29
收藏
得分:0 

VC++6.0下调试成功。 ======================= #include <iostream.h> #include <math.h> int isprime(int n) { int flag=0; int i=2; while((flag==0)&&(i<=sqrt(n))) { if(n%i==0) flag=1; i++; } if(flag==0) return 1; else return 0; } void main() { int n,j,k; cin>>n; int i=0; int a[15]; //65535以内的数最多分解出15个素数因子 for(int m=0;m<15;m++) a[m]=0; if(isprime(n)) cout<<n<<"本身是素数,不能分解!"<<endl; else{ for(j=n,k=n;j>1;j--) { if(isprime(j)&&(k%j==0)) { a[i++]=j; k=k/j; j=k; if(j==2) a[i]=2; }

} cout<<n<<"="; for(int b=14;b>=0;b--) { if(a[b]!=0) { if(b!=0) cout<<a[b]<<"*"; else cout<<a[b]; } } cout<<endl; }

}

[此贴子已经被作者于2005-5-18 17:23:09编辑过]

2005-05-18 17:12
hu_sir
Rank: 1
等 级:新手上路
帖 子:208
专家分:0
注 册:2004-4-29
收藏
得分:0 
这只是输入一个数据的测试


相信多个数据就不用说了吧。

[此贴子已经被作者于2005-5-18 17:20:44编辑过]


2005-05-18 17:20
tary
Rank: 1
等 级:新手上路
帖 子:780
专家分:0
注 册:2004-10-5
收藏
得分:0 
好..!支持..

┌→¨ ≮我可以学会对你很冷落≯¨←┐ │  <却学不╓══╦══╖会将爱> │ │¨←┐ ╭╩╮哭‖哭╭╩╮ ┌→¨│ └──┘收 ╲╱ ◇‖◇ ╲╱回└──┘
2005-05-19 12:29
Antigloss
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2004-12-30
收藏
得分:0 
以下是引用hu_sir在2005-5-18 13:20:54的发言:

(能否改成用类来实现?忘指点!)

当然可以。VC++6.0下编译通过 请下载:

qudPlJdZ.rar (10.14 KB) 关于ASCII压缩算法问题

ps:我不是高手。 本人懒,所以某些代码使用了以前学数据结构时写的C代码。不当之处,还请指出

2005-05-19 20:09
hu_sir
Rank: 1
等 级:新手上路
帖 子:208
专家分:0
注 册:2004-4-29
收藏
得分:0 
谢谢!!

3Q!!
2005-05-19 22:24
hu_sir
Rank: 1
等 级:新手上路
帖 子:208
专家分:0
注 册:2004-4-29
收藏
得分:0 
从时间复杂度的角度来考虑能优化一下吗?


谢谢!
2005-05-20 14:29
hu_sir
Rank: 1
等 级:新手上路
帖 子:208
专家分:0
注 册:2004-4-29
收藏
得分:0 
很长时间没来论坛了

唉,连斑竹的职位都被撤了。

不过发现论坛上的高手的确度了阿!
2005-05-20 14:30
快速回复:关于ASCII压缩算法问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017293 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved