ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:18.93KB ,
资源ID:5128127      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5128127.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(不同进制数之间的转换和应用.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

不同进制数之间的转换和应用.docx

1、不同进制数之间的转换和应用 不同进制数之间的转换和应用例1(ZOJ-1383): 给出一个正整数,将它用2进制表示,如果位置上的数是1,则把它的1所在的位置打印出来.规定最低位标志为0.如13,位置上为1的有0,2,3.输入: 输入的第一行包含一个正整数d ,表示要测试的数据有多少种.1=d=10;接着输入d行,每行有一个正整数n, 1 = n = 106.输出: 输出应有d行,每行对应一组测试的结果.每一行的数列成递增排列.分析:只要把n转换成2进制就可以了。源代码:# include# include# includeint main() int n,i,j; bool bo; scanf

2、(%d,&n); long* p=(long*)malloc(sizeof(long)*n); for (i=0;in;i+) scanf(%ld,&pi); for (i=0;in;i+) bo=true; j=0; while (pi!=0) if (pi%2=1) if (bo) printf(%d,j); bo=false; else printf( %d,j); j+; pi=pi/2; printf(n); system(pause); return 0;例2(ZOJ-1712): 当一个数用10进制表示时,第kth位代表10k的倍数.81307(10) = 8 * 104 + 1

3、 * 10 3 + 3 * 102 + 0 * 101 + 7 * 100= 80000 + 1000 + 300 + 0 + 7= 81307. 当一个数用2进制表示时, 第kth位代表2 k的倍数.10011(2) = 1 * 24 + 0 * 23 + 0 * 22 + 1 * 21 + 1 * 20= 16 + 0 + 0 + 2 + 1= 19. 现在出现一种特殊的进制,叫skew2进制. 第kth位代表2(k+1)-1的倍数.10120(skew) = 1 * (25-1) + 0 * (24-1) + 1 * (23-1) + 2 * (22-1) + 0 * (21-1)= 3

4、1 + 0 + 7 + 6 + 0= 44.输入: 有多种测试,每行有一个整数n,如果n=0停止测试.n是用skew进制表示的整数.输出: 对每一个数,输出它的10进制表示.源代码:# include# includeint main() long int sum; int i,j,k; char p100; scanf(%s,p); while (p0!=0) sum=0; j=strlen(p); k=1; for (i=j-1;i=0;i-) k=k*2; sum=sum+(pi-0)*(k-1); printf(%ldn,sum); scanf(%s,p); return 0;例3(Z

5、OJ-2371): 考虑所有由非负的3的次方组成的集合.S = 1, 3, 9, 27, 81, . 考虑由S的子集组成的序列(按子集里元素的总和递增排列).问题是找出在这个序列里第n-th个位置上的子集,并将它按元素递增的方向排列.输入: 每行包含一个数n,并且n不超过19位.当n=0时,停止测试.输出: 对每个n,输出第n-th个子集.输出格式如下.输入:11478311259009816340490输出: 3, 9 3, 9, 27, 6561, 19683 59049,3486784401,205891132094649,717897987691852588770249 分析: 观察这

6、个序列的前几项 ,1,3,1,3,9,1,9,3,9,1,3,9。对于 1, 3, 9, 27, 81, . ,1为第一位,3为第二位,9位第三位。如果把 对应0(什么都没有);1对应1;3对应10;1,3对应11;9对应100;1,9对应101;3,9对应110;1,3,9对应111。 发现规律这个序列的每一项对应一个唯一的2进制码,且从左直右,连续递增。而2进制0,1,10,11,100,101,110,111。刚好对应10进制中的0,1,2,3,4,5,6,7,8。 因此求第n-th个子集可以先把n转化成2进制的格式。且定义从右直左为第一位,第二位,第三位。在n的2进制格式里,那一位是1

7、,就表示包含集合S 1, 3, 9, 27, 81, . 中的第几个元素。源代码:# include# include# includevoid f(char* a,char* c) int i,j,ca,* s; ca=strlen(a); s=(int*)malloc(sizeof(int)*(ca+1); for (i=0;ica+1;i+) si=0; for (i=1;i=0;i-) if (si=10) si-1+=si/10; si%=10; i=0; while (si=0) i+; for (j=0;ica+1;i+,j+) cj=si+0; cj=0; printf(%sn

8、,c); free(s);int main() long long n; int i,j; bool sign; char s6440,p64; s00=1; s01=0; for (i=1;i64;i+) f(si-1,si); scanf(%lld,&n); while (n!=0) if (n=1) printf( n); else i=0; n-; while (n!=0) pi=n%2+0; n/=2; i+; pi=0; sign=true; printf(); for (j=0;ji;j+) if (pj=1) if (sign) printf( %s,sj); sign=fal

9、se; else printf(, %s,sj); printf( n); scanf(%lld,&n); return 0;例4(ZOJ-1272): 一位喜欢玩字谜游戏人决定把从1-20个字母间的单词跟唯一的整数建立一种映射。映射规则很简单,这些单词先按长度排列,同长度的再按字典序排列。部分映射如下:a 1 b 2 . z 26 aa 27 ab 28 . snowfall 157,118,051,752 .你的任务是编写一个程序,能在这唯一的单词对应的数和这个单词间进行转换。输入: 输入的是一系列的单词和数,每一行从第一列开始输入。如果一行输入的是数,那它只包含0-9。如果一行输入的是单

10、词,那它只包含a-z。如果一行输入是*,测试停止。输出: 每一行输出一个单词和它对应的数。每一行单词先从第一列开始输出。接着在第23列开始输出对应的数。这个数从右直左每3个作为一个单元,以,隔开。输入: 29697684282993transcendental28011622636823854456520computationallyzzzzzzzzzzzzzzzzzzzz*输出:elementary 29,697,684,282,993transcendental 51,346,529,199,396,181,750prestidigitation 28,011,622,636,823,85

11、4,456,520computationally 232,049,592,627,851,629,097zzzzzzzzzzzzzzzzzzzz 20,725,274,851,017,785,518,433,805,270分析: 观察映射关系,想能不能用26进制数,将这些单词有序的表示出来。可这里没有字母对应0。不能直接应用26进制。但我们可以把它看成一个特殊的26进制,从1-26。 先考虑从单词转化成数,假如word=x1x2x3xn.(x1,x2,xn都为字母)number=0;for (i=1;i=n;i+) /这里先不考虑高精度问题。 number=number*26;number+=

12、xi-a+1; 把数转换成单词while (number!=0) /没考虑高精度问题 number-; xi=number%26+a; number/=26; i+;这时得到的word与要求的单词正好反序。源代码:# include# include# includevoid multiply(char* a,char* b,char* c) int i,j,ca,cb,* s; ca=strlen(a); cb=strlen(b); s=(int*)malloc(sizeof(int)*(ca+cb); for (i=0;ica+cb;i+) si=0; for (i=0;ica;i+) f

13、or (j=0;j=0;i-) if (si=10) si-1+=si/10; si%=10; i=0; while (si=0) i+; for (j=0;ica+cb;i+,j+) cj=si+0; cj=0; free(s);int dividor(char* a,int b,char* c) int i,j,temp=0,n; char* s; n=strlen(a); s=(char*)malloc(sizeof(char)*(n+1); for (i=0;ai!=0;i+) temp=temp*10+ai-0; si=temp/b+0; temp%=b; si=0; for (i=

14、0;si=0&si!=0;i+); if (si=0) c0=0; c1=0; else for (j=0;si!=0;i+,j+) cj=si; cj=0; free(s); return temp;void add(char* a,char* b,char* c) int i,j,k,max,min,n,temp; char *s,*pmax,*pmin; max=strlen(a); min=strlen(b); if (max=0;i-,j-,k-) sk=pmini-0+pmaxj; for (;j=0;j-,k-) sk=pmaxj; for (i=max;i=0;i-) if (

15、si9) si-=10; si-1+; if (s0=0) for (i=0;i=max;i+) ci-1=si; ci-1=0; else for (i=0;i=max;i+) ci=si; ci=0; free(s);void change(char s) int i,j; char c; j=strlen(s); for (i=0,j=j-1;icb|(ca=cb&strcmp(a,b)=0) for (i=ca-1,j=cb-1;j=0;i-,j-) ai-=(bj-0); for (i=ca-1;i=0;i-) if (ai=0;i-,j-) bj-=(ai-0); for (j=c

16、b-1;j=0;j-) if (bj=0&s0=9) i=0; strcpy(sa,s); while (s0!=0) subtract(s,1,s); sbi+=dividor(s,26,s)+a; sbi=0; change(sb); else strcpy(sb,s); n=strlen(s); i=s0-a+1; if (i=9) sa0=i+0; sa1=0; else sa0=i/10+0; sa1=i%10+0; sa2=0; for (i=1;in;i+) multiply(sa,26,sa); j=si-a+1; if (j=9) temp0=j+0; temp1=0; el

17、se temp0=j/10+0; temp1=j%10+0; temp2=0; add(sa,temp,sa); printf(%-22s,sb); n=strlen(sa); switch (n%3) case 0: for (i=0;in;i+) printf(%c,sai); if (i%3=2&i!=n-1) printf(,); break; case 1: for (i=0;in;i+) printf(%c,sai); if (i%3=0&i!=n-1) printf(,); break; case 2: for (i=0;in;i+) printf(%c,sai); if (i%3=1&i!=n-1) printf(,); printf(n); scanf(%s,s); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1