书名:GESP编程能力等级认证一本通(C++三级)
ISBN:978-7-115-69203-0
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
主 编 刘 寄 张 兵 来章润
副 主 编 王桂平 谢小莉 刘钦波
责任编辑 吴晋瑜
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
“GESP编程能力等级认证一本通”是专门为中小学生编写的一套学习C++编程和算法的图书。本套图书严格围绕计算机学会(CCF)发布的《CCF编程能力等级认证(GESP)C++认证标准》而设计。
本书对应C++三级,共15章,内容包括多进制转换与应用、计算机数据编码基础、二进制高效算法初探、位运算基础、位运算进阶、C++一维数组精解、vector容器初步、set容器初步、C风格字符串、C++ string类、map容器初步、模拟算法应用、枚举算法实战、算法描述与设计方法、考场调试技巧等。
本书配备了题库、课件、课程视频(在线)、OJ等资源,可以作为中小学编程社团的教学用书,也可以作为青少年编程培训机构的培训用书,还可以作为青少年编程等级考试和编程竞赛的入门参考书。
(排名不分先后)
主 编:刘 寄 张 兵 来章润
副主编:王桂平(重庆交通大学)
谢小莉(重庆市万州区教育进修学院)
刘钦波(重庆市永川区教师进修学校)
参 编:蒋元松(重庆科学城富力南开小学校)
陈 菊(重庆市江北区科技实验小学校)
李昭欢(成都市温江区东辰外国语学校)
刘保林(重庆市江北巴川量子学校)
党 东(重庆市巴蜀中学校)
宋 梅(重庆市第十一中学校)
牛文娟(贵州省盘州市第二中学)
唐宏毅(重庆市第十八中学)
符 梅(重庆两江新区星海学校)
明正华(重庆市第十一中学校)
吴泽伟(广东省汕头市博崇实验学校)
彭俊超(重庆市巴蜀中学校)
向思权(湖南省洪江市芙蓉中学)
曹 航(重庆市巴蜀中学校)
石良娟(重庆市巴蜀中学校)
向 毅(重庆市巴蜀中学校)
潘以华(重庆市北碚区王朴中学校)
傅祥斌(重庆市第八中学校)
张凯亮(重庆第三十中学校)
在数字化浪潮席卷全球的当下,编程已成为青少年迈向未来、拥抱科技的关键技能之一。国家对编程教育高度重视,早在2017年,国务院发布的《新一代人工智能发展规划》就明确提出,要在中小学阶段设置人工智能相关课程,逐步推广编程教育。教育部随后在《教育信息化2.0行动计划》中进一步强调,要完善课程方案和课程标准,充实适应信息时代、智能时代发展需要的人工智能和编程课程内容。这些政策的出台,为青少年编程教育指明了方向,奠定了坚实的基础。
在这样的背景下,中国计算机学会(CCF)发起了编程能力等级认证(GESP)项目,旨在为青少年计算机和编程学习者提供一个权威、公正的学业能力验证平台。GESP覆盖中小学全学段,通过科学分级的考试体系,全面考查学生在编程知识、操作能力及理论框架等方面的掌握程度。其中,C++作为一门广泛应用于系统软件、应用软件、游戏开发等多个领域的编程语言,既是编程教育的普及语言,也是信奥教育的拔尖语言。GESP C++认证共分为一至八级,每一级都针对不同年龄段和学习阶段的学生设定了明确的知识目标和技能要求。
本书正是为了满足广大青少年编程学习者的需求而精心编写的。本书项目由“傲梦少年”联盟发起,编委会成员由各级教师进修学院教研员、大中小学资深教师组成,他们凭借丰富的教学经验和对编程教育的深刻理解,确保了本书内容的科学性和实用性。
本书紧密围绕GESP C++三级的考试大纲,内容包括多进制转换与应用、计算机数据编码基础、二进制高效算法初探、位运算基础、位运算进阶、C++一维数组精解、vector容器初步、set容器初步、C风格字符串、C++ string类、map容器初步、模拟算法应用、枚举算法实战、算法描述与设计方法、考场调试技巧。此外,本书还包含3个附录,附录A介绍了STL(标准模板库)容器快速参考手册,附录B是位运算技巧速查表,附录C是基础知识练习答案。
在内容编排上,注重循序渐进,从基础概念入手,逐步引导学生深入学习编程的思维方式和实践技巧。同时,书中配备了大量生动有趣的实例和练习,旨在帮助学生更好地理解和掌握所学知识,提高编程实践能力。
此外,本书的编写还充分考虑了国家编程教育政策的要求,致力于激发青少年对编程的兴趣,培养他们的逻辑思维和创新能力。通过学习本书,学生不仅能够为参加GESP C++三级认证考试做好充分准备,还将在编程的道路上迈出坚实的一步,为未来的学习和发展打下基础。
我们相信,在国家政策的引领下,在社会各界的共同努力下,青少年编程教育将迎来更加美好的明天。希望本书能够成为广大青少年编程学习者的良师益友,助力他们在编程的世界里绽放光彩,开启通往未来科技的大门。
编者
2026年2月
本书提供如下资源:
• 配套视频课程(在线课程)
• 源代码
• PPT文件
• 在线评测平台(小虫OJ,https://www.xiaochongoj.cn/)
• 本书思维导图
• 异步社区7天VIP会员
要获得以上资源,读者可以扫描下方二维码,根据指引领取。

作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎读者将发现的问题反馈给我们,帮助我们提升图书的质量。
当读者发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,单击“发表勘误”,输入勘误信息,单击“提交勘误”按钮即可(见右图)。本书的作者和编辑会对读者提交的勘误进行审核,确认并接受后,将赠予读者异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。

本书责任编辑的联系邮箱是wujinyu@ptpress.com.cn。
如果读者对本书有任何疑问或建议,请发送邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果读者有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们。
如果读者所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果读者在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请将怀疑有侵权行为的链接发邮件给我们。这一举动是对作者权益的保护,也是我们持续为广大读者提供有价值的内容的动力之源。
“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域多年来的发展与积淀。异步图书面向IT行业以及各行业使用IT的用户。
本章主要内容
• 十进制与二进制。
• 十进制与其他进制。
同学们,我们所熟悉的十进制数主要用来表示两种信息:顺序(编码)和数量。比如每个月份中的数字表明这个月是当年的第几月,你的学号或者身份证号是为了和其他同学或者公民进行区分的编码,也可以表示某种东西的数量(比如牛群中牛的数量)。十进制数的计数规则是逢十进一,根据这种规则十进制数被分成了个位、十位、百位等不同的数位。根据十进制每个数位权重的规则,数字123456可以写成
123456 = 1×100000 + 2×10000 + 3×1000 + 4×100 + 5×10 + 6×1
把每个数位的权重记为指数的形式,可以写成
123456 = 1×105 + 2×104 + 3 × 103 + 4 × 102 + 5 × 101 + 6 × 100
原码、补码、反码的知识将在后续章节介绍,本章仅讨论非负整数与非负小数的多进制(含十进制、二进制及其他进制)转换。
之所以采用十进制,或许是因为普通人有10根手指,人们掰着手指数数而自然形成了十进制。历史上著名的德国数学家莱布尼茨提出了二进制,他还发现中国的太极八卦图(见图1.1)可以用二进制数来解释(乾=111、巽=011、坎=010、艮=001、坤=000、震=100、离=101、兑=110)。

图1.1 太极八卦图
电子元器件没有10根手指,但是电路天然就有开、关两种状态。根据这个特点,现代计算机之父冯•诺依曼在莱布尼茨的数学研究基础上设计了采用二进制进行运算的数字电子计算机。由于是逢二进一,因此二进制数每个数位最大是1(十进制数每个数位最大是9)。那么一个二进制整数(1010)2参照十进制的规则可以写成
1 × 23 + 0 × 22 + 1 × 21 + 0 × 20=(10)10
十进制小数0.1234,可以写成
0.1234 = 1 × 0.1 + 2 × 0.01 + 3 × 0.001 + 4 × 0.0001
把每个数位的权重记为分数的形式,可以写成

把每个数位的权重记为指数的形式,可以写成
0.1234 = 1 × 10−1 + 2 × 10−2 + 3 × 10−3 + 4 × 10−4
二进制小数0.1011可以写成
(0.1011)2 = 1 × 2−1 + 0 × 2−2 + 1 × 2−3 + 1 × 2−4
按照分数加指数的形式可以写成

按照分数的形式可以写成

按照十进制小数的形式可以写成
(0.1011)2 = 1 × 0.5 + 0 × 0.25 + 1 × 0.125 + 1 × 0.0625 = (0.6875) 10
那么,十进制如何转换为二进制呢?将十进制数转换为二进制数,可基于数的位置记数法原理“一个十进制整数可以表示为二进制位的加权和”,即
(n)10 = dk × 2k + dk−1 × 2k−1+ ... + d1 × 21 + d0 × 20
其中di(i=0, 1, … , k)为二进制位的值,是0或1。十进制数到二进制数的转换通常需要分别处理整数部分和小数部分。
整数部分最常用且基础的方法是“除2取余,逆序排列”法,具体过程如下。
(1)用十进制整数除以2,记录下商和余数(0或1)。
(2)用上一步得到的商继续除以2,再记录新的商和余数。
(3)重复步骤(2),直到商为0为止。
(4)将每次得到的余数按照从后向前(最后一次计算的余数为最高位)的顺序排列,即得到二进制整数部分。
例如,将十进制数25转换为二进制,具体计算过程如下。
25 ÷ 2=12...余1(最低位)
12 ÷ 2=6 ...余0
6 ÷ 2=3 ...余0
3 ÷ 2=1 ...余1
1 ÷ 2 =0 ...余1(最高位)
按逆序排列余数(从下往上),得到11001,所以(25)10=(11001)2。
十进制小数转二进制小数采用“乘2取整,顺序排列”法,具体过程如下。
(1)用十进制小数乘以2,记录积的整数部分(0或1)和剩余的小数部分。
(2)用上一步得到的小数部分继续乘以2,再记录新的整数部分和剩余的小数部分。
(3)重复步骤(2),直到小数部分为0,或者达到所需的精度(如保留8位小数)。
(4)将每次取出的整数部分按照从前往后(第一次取的整数为最高位)的顺序排列,即得到二进制小数部分。
例如,将十进制小数0.625转换为二进制,具体计算过程如下。
0.625 × 2=1.25→取出整数部分1,余0.25
0.25 × 2=0.5 →取出整数部分0,余0.5
0.5 × 2=1.0 →取出整数部分1,余0(停止)
按顺序排列整数(从上到下),得到101,所以(0.625)10 = (0.101)2。
从1.1节对十进制和二进制的介绍中可以总结出如下规则:假设某个数(含整数和小数)采用N(N≥2)进制表示,则每个数位的数字di需满足0≤di< N(i为整数,整数部分i≥0,小数部分i < 0),每个数位的最大数字为N−1。由于一位阿拉伯数字只能表示0~9,超过十的进制每一个数位的数字都有可能大于9,这里就不得不借助英文字母来表示大于9的数字。超过十的进制用字母A表示10,字母B表示11,以此类推。
对于其他进制的整数,我们按照1.1节中的方法将每个数位表示成指数形式,可以写成
M(N) = mk × N k + mk−1 × Nk−1…+ m1 × N 1 + m0 × N 0 [mi (i=0, 1, … , k)是M每个数位的数字]
这就是将N进制的整数转换为十进制数的基本公式。参照1.1节中的方法,任意进制的整数转换为十进制数采用此公式直接计算即可。例如,要把八进制数(4567)8转换为十进制数,代入上述公式进行计算:
(4567)8 = 4 × 83 + 5 × 82 + 6 × 81 + 7 × 80 = (2423)10
又如,要把十六进制数(89AB)16转换为十进制数,代入上述公式进行计算:
(89AB)16 = 8 × 163 + 9 × 162 + 10 × 161 + 11 × 160 = (35243)10
其他进制的小数M(1 > M > 0)按照前面一节将每个数位表示成指数形式可以写成
M(N) = mk × N −1 + mk−1 × N −2… + m1 × N −(k−1) + m0 × N −k [mi (i=0, 1, … , k)是M每个数位的数字]
这就是将N进制的小数转换为十进制小数的基本公式。将指数形式改为分数形式可以写成

任意进制的小数转换为十进制数采用此公式直接计算即可。例如,八进制数0.45(8)转换为十进制数,代入上述公式进行计算:

又如,十六进制数(0.A)16转换为十进制数,代入上述公式进行计算:

参照前面十进制转换二进制的方法,我们先总结一下十进制转换为N进制的方法,即十进制整数转N进制采用“除N取余,逆序排列”法;十进制小数转N进制则采用“乘N取整,顺序排列”法。
(1)整数部分转换。具体过程如下。
① 用十进制整数除以N,记录下商和余数(0~N−1)。
② 用上一步得到的商继续除以N,再记录新的商和余数。
③ 重复步骤②,直到商为0为止。
④ 将每次得到的余数按照从后向前(最后一次计算的余数为最高位)的顺序排列,即得到N进制整数部分。
(2)小数部分转换。具体过程如下。
① 用十进制小数乘以N,记录积的整数部分(0~N−1)和剩余的小数部分。
② 用上一步得到的小数部分继续乘以N,再记录新的整数部分和剩余的小数部分。
③ 重复步骤二,直到小数部分为0,或者达到所需的精度。
④ 将每次取出的整数部分按照从前往后(第一次取的整数为最高位)的顺序排列,即得到N进制小数部分。
例如,要将十进制数68.68转换为八进制数(精确到小数点后5位),具体过程如下。
① 整数部分(68)的计算如下。
68 ÷ 8=8…4
8 ÷ 8=1…0
1 ÷ 8=0…1
按逆序排列余数,得到104,所以(68)10 = (104)8。
② 小数部分(0.68)的计算如下。
0.68 × 8=5.44→5(整数部分)
0.44 × 8=3.52→3(整数部分)
0.52 × 8=4.16→4(整数部分)
0.16 × 8=1.28→1(整数部分)
0.28 × 8=2.24→2(整数部分)
按顺序排列整数,得到53412,所以(0.68)10≈(0.53412)8。
由此可知,最终结果为(68.68)10≈(104.53412)8。
C++标准库中的cin用于整数输入时,默认情况下:
• 能够识别十进制数字(如123);
• 能够识别八进制数字(以0开头,如0123);
• 能够识别十六进制数字(以0x或0X开头,如0x1A)。
但默认情况下,它不能识别以0b或0B开头的二进制格式字符串。如果直接输入 0b10111,cin会将其看作十进制数字0(遇到非数字字符 b会停止读取)后面跟着无法解析的字符串"b10111",这通常会导致错误或不符合预期的结果。从C++14标准开始,可以直接在代码中使用0b或0B前缀来表示二进制数(注意:仅在源代码中有效,输入流cin仍无法识别)。
C++标准库提供了对八进制和十六进制的直接流操作符,如表1.1所示。
表1.1 对八进制和十六进制的直接流操作符
| 进制 |
输入操作 |
输出操作 |
示例代码 |
示例输出 |
|---|---|---|---|---|
| 八进制 |
cin>>oct>>var; |
cout<<oct<<var; |
cout<<oct<<255; |
0173(123的八进制) |
| 十进制 |
cin>>dec>>var; |
cout<<dec<<var; |
cout<<dec<<255; |
255 |
| 十六进制 |
cin>>hex>>var; |
cout<<hex<<var; |
cout<<hex<<255; |
ff |
注意,进制控制符(如hex)会持续生效,直到下次更改。因此,如果后续需要以十进制输入输出,记得使用dec恢复。
给定一个指定的进制n(1 < n < 10)和一个n进制的数m,输出m的十进制表达式。
两个整数,中间用空格隔开。
输出一行,即一个十进制的表达式。
【样例输入】 |
【样例输出】 |
|---|---|
2 10101 |
1*2^4+1*2^2+1*2^0 |
本题是将输入的n进制整数m用十进制表达式输出。采用1.2节的n进制表示为十进制的公式输出即可,由于需要省略数位为0的项,循环中要注意加号的输出。代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( ){
int m,len;
string n;//由于C++输入并不支持任意进制,这里将n定义为字符串
cin>>m>>n;
len=n.length();//获取字符串长度
for(int i=0;i<len;i++){//从左往右读取字符串,即从高位往低位读取n
if(n[i]−'0'>0){//当前数位不为零即可输出
if(i>0)cout<<'+';//当前数位不是最高位,需要在前面输出加号
cout<<n[i]<<'*'<<m<<'^'<<len−i−1;//按照题目规定的格式输出
}
}
return 0;
}输入十进制数n和目标进制r(2≤r≤36),输出转换后的r进制数。
输入第一行是一个正整数n(1≤n≤106),第二行是正整数r(2≤r≤36)。
输出一行。n的r进制表示。
【样例输入】 |
【样例输出】 |
|---|---|
123 25 |
4N |
本题是将输入的正整数n转换为r进制的数。采用“除n取余,逆序排列”法即可,由于需要用r进制表示,需要用字符格式输出。代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( ){
int n,r,cnt=0;//n为待转换的正整数,r为待转换的进制,cnt为转换后的数位
char s[32];
cin>>n>>r;
while(n!=0){//商不为零即继续
int q=n%r;//取余数
if(q>=0&&q<=9)s[cnt]='0'+q;//将余数转换为对应的字符并记录到相应数位
else s[cnt]='A'+q−10;
n/=r;//求商
cnt++;
}
for(int i=cnt-1;i>=0;i--)cout<<s[i];//逆序输出转换后的字符
return 0;
}注意,十进制整数转换为n进制整数一定要逆序输出所得的商。
若将一个正整数化为无前导零的二进制数,该二进制数中数字 1 的个数多于数字 0 的个数,则称为 A 类数;否则称为 B 类数。
例如:
(13)10 = (1101)2,其中1的个数为3,0的个数为1,此数为A类数;
(10)10 = (1010)2,其中1的个数为2,0的个数也为2,此数为B类数;
(24)10 = (11000)2,其中1的个数为2,0的个数为3,此数为B类数;
请求出1~n中(1≤n≤1000),全部A、B两类数的个数。
输入一个整数n。
两个整数,分别是1~n中A类数的个数和B类数的个数,用一个空格隔开。
【样例输入】 |
【样例输出】 |
|---|---|
7 |
5 2 |
对于1~n的每一个数,均要转换为二进制数并统计所有数位的0和1的个数,再判断是A类数还是B类数。代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( ){
int n,cnta=0,cntb=0;
cin>>n;
for(int i=1;i<=n;i++){
int t=i,cnt0=0,cnt1=0;
while(t){//从最低位开始对t进行二进制转换
if(t%2)cnt1++;//当前数位为1
else cnt0++;//当前数位为0
t/=2; //去掉二进制数的最低位
}
if(cnt1>cnt0)cnta++;//判断t是A类数还是B类数
else cntb++;
}
cout<<cnta<<' '<<cntb;
return 0;
}十进制数字中的每一个数码可以用数位来描述。例如,503的个位为3,十位为0,百位为5。对其进行数位翻转,就是将最高位变为最低位,而最低位变为最高位。503翻转后的结果为305。
小A定义了“第二数位”。十进制数从低位到高位,每两个数码构成一个“第二数位”,最高位不足两个数码的,用前导零补齐。例如,12345将被划分为012345,共3个“第二数位”。
类似地,“第二数位”翻转,就是将最高位的“第二数位”变为最低位的“第二数位”,而最低位的“第二数位”变为最高位的“第二数位”。“第二数位”内的数码顺序不变。
给出整数n(1≤n≤1018),请对其进行“第二数位”翻转。翻转后输出的十进制整数不应包含前导零。
一行,是一个正整数n。
一行,是一个整数,表示对n“第二数位”翻转后的结果。
【样例输入1】 |
【样例输出1】 |
|---|---|
123456 |
563412 |
【样例输入2】 |
【样例输出2】 |
12345 |
452301 |
【样例输入3】 |
【样例输出3】 |
100101 |
10110 |
本题可将输入的十进制数视为 100 进制数(每两位数字为一个 100 进制数位,不足两位时高位补 0),取出所有 100 进制数位后逆序排列,再转换为十进制数(依次乘以 100 累加),即为“第二数位”翻转结果。代码如下:
#include <iostream>
using namespace std;
int main( ){
long long n,ans=0;
cin>>n;
while(n){
ans=ans*100+n%100;//取出n的100进制数的最低位,逆序排列到ans的高位
n/=100;//去掉n的100进制数的最低位
}
cout<<ans;
return 0;
}给定一个正整数n,输出将该数转换为二进制数的过程中每次得到的商和余数。
一行,一个正整数n,表示要转成二进制数的数字。
若干行,每一行两个数字xi和yi,表示第i次除法运算得到的商和余数。应该保证yi为0或1。
【样例输入】 |
【样例输出】 |
|---|---|
9 |
4 1 2 0 1 0 0 1 |
本题将十进制数转换为二进制数的过程中的所有商和余数依次输出。代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( ){
long long n;
cin>>n;
while(n){
cout<<n/2<<' '<<n%2<<endl;//输出本次转换的商和余数
n/=2;//去掉二进制数的最低位
}
return 0;
}现在有n个数,请你分别判断它们是否可能是二进制数、八进制数、十进制数、十六进制数。例如,15A6F就只可能是十六进制数,而1011则是4种进制数皆有可能。
输入的第一行为一个十进制表示的整数N。接下来N行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,可能以0开头。保证不会出现空行。
其中,1≤n≤1000,且所有字符串长度不超过10。
输出n行,每行4个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用1表示可能,使用0表示不可能。
【样例输入1】 |
【样例输出1】 |
|---|---|
2 15A6F 1011 |
0 0 0 1 1 1 1 1 |
【样例输入2】 |
【样例输出2】 |
4 1234567 12345678 FF GG |
0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 |
本题每个待判定的数能否用某种进制表示只和该数字每个数位上的最大数字有关。代码如下:
#include <bits/stdc++.h>
using namespace std;
int main( ){
int n;
string s;
cin>>n;
while(n--){
cin>>s;
bool a[4] = {1, 1, 1, 1};
//定义一个 bool 类型数组,用来表示能否表示对应的进制数
for (int j = 0; j < s.length(); j++){//依次判断字符串中每一个字符
if (s[j] > '1') a[0] = 0;
if (s[j] > '7') a[1] = 0;
if (s[j] > '9') a[2] = 0;
if (s[j] > 'F') a[3] = 0;
}
cout << a[0] << ' ' << a[1] << ' ' << a[2] << ' ' << a[3] << endl;
}
return 0;
}【选择题】
1.二进制数11.01在十进制下是( )。
A.3.01
B.3.05
C.3.125
D.3.25
2.对于一个十进制数37,以下哪个是它的二进制表示( )。
A.10101
B.100101
C.101001
D.1000101
3.下列关于十六进制的描述中,正确的是( )。
A.使用0~9和A~F表示
B.使用0~9和A~E表示
C.使用1~9和A~F表示
D.使用1~9和A~E表示
4.已知大写字符'A'的ASCII的十六进制表示为0x41,则字符'F'的ASCII的十六进制表示为( )。
A.0x46
B.0x47
C.0x48
D.0x49
5.下列关于进制的叙述,不正确的是( )。
A.正整数的二进制表示中只会出现0和1
B.10不是2的整数次幂,所以十进制数无法转换为二进制数
C.将整数从二进制转换为8进制时,可以很方便地由低到高将每3位二进制位转换为对应的一位八进制位
D.将整数从二进制转换为十六进制时,可以很方便地由低到高将每4位二进制位转换为对应的一位十六进制位
6.已知大写字符'A'的ASCII的十六进制表示为0x41,则字符'L'的ASCII的十六进制表示为( )。
A.4A0x
B.4B0x
C.4C0x
D.520x
7.在下列编码中,不能够和二进制"1101 1101"相等的是( )。
A.(221)十进制
B.(335)八进制
C.(dd)十六进制
D.(5d)十六进制
8.C++的字符变量的码值是整数,下面字面量形式的字符码值最大的是( )。
A.100
B.075
C.0x70
D.0x60
9.下面二进制数101.11对应的十进制数是( )。
A.6.5
B.5.5
C.5.75
D.5.25
10.8进制数3703转换成十六进制数是( )。
A.7C3
B.7A3
C.7B3
D.7D3
11.十进制数0.8125变成二进制数是( )。
A.0.1110
B.0.1 1111 1011 1101
C.0.1 1111 1011 1100
D.0.1101
12.十六进制数B2025转换成八进制数是( )。
A.2620045
B.2004526
C.729125
D.2420045
13.十进制数625.625变成二进制数是( )。
A.1001110001.101
B.101.101
C.101.1001110001
D.1001110001.1101
14.十进制数111.111的二进制表示可以是下面的( )。
A.1101111.0001110001
B.1101110.1001110001
C.1101111.1001110001
D.1101111.0011110001
15.下面程序是将十进制转十六进制,横线处应该填入的是( )。
#include <iostream>
using namespace std;
int main() {
int decimal = 255;
________________________
return 0;
}A.cout << oct << decimal;
B.cout << decimal << decimal;
C.cout << hex << decimal;
D.不能正确执行
16.二进制数1101.101对应的十进制数是( )
A.13.625
B.12.75
C.11.875
D.14.5
17.八进制数35.6对应的十进制数是( )
A.29.75
B.28.5
C.27.625
D.30.25
【判断题】
1.在C++中,表达式(0xff==255)的值为true。( )
2.计算机中存储的数据都是二进制形式。因此,在使用C++编写程序时,将所有十进制数改写为相同数值的二进制数,会使得程序运行效率更高。( )
3.在C++中,表达式(0xf==015)的值为true。( )
4.二进制数101.101在十进制下是5.005。( )
5.十六进制数AB,表示成二进制数是10101011 。( )
6.def(十六进制)=103231(五进制)。( )
7.十进制数63,在转换成二进制数的计算过程中,产生了如下的式子:
63/2=31 余 1
31/2=15 余 1
15/2=7 余 1
7/2=3 余 1
3/2=1 余 1
1/2=0 余 1按照从前往后的顺序,获得63的二进制值是111111( )。
8.若将一个正整数化为二进制数,在此二进制数中,将数字1的个数是偶数的二进制数称为A类数,否则就称其为B类数。例如,13(10) = 1101(2),其中1的个数为3则称此数为B类数;10(10) = 1010(2),其中1的个数为2,称此数为A类数;判断2025(10)化为二进制后,1的个数为偶数个,因此2025为A类数。( )
9.下列这段程序将n不停地除以2,并输出此时的商和余数,直到n等于0为止。
#include <iostream>
using namespace std;
int main() {
long long n;
cin >> n;
while (n != 0) {
cout << n / 2 << ' ' << n % 2 << '\n';
n /= 2;
}
return 0;
}( )
10.两个十三进制的数A和B,在十进制下分别表示10和11,也就是说,十三进制数A加上十三进制数B,其和为十三进制数18。( )
11.k进制,逢k进第二位,进百位,进千位。( )
12.CCF(十九进制)=21AC(十三进制)(不区分大、小写)。( )