当前位置:文档之家› 利用顺序栈将一个非负的十进制整数N转换为对应的B进制数

利用顺序栈将一个非负的十进制整数N转换为对应的B进制数

利用顺序栈将一个非负的十进制整数N转换为对应的B进制数
利用顺序栈将一个非负的十进制整数N转换为对应的B进制数

#include

#include

#define init_size 100

#define increasesize 10

typedef struct{

int * base;

int * top;

int stacksize;

}SqStack;

void OutPrint(SqStack &s)

{

SqStack p=s;

if(p.base==p.top)

{

printf("栈当前为空");

}

else

{

int i=0;

printf("栈当前数据:");

while(i

{

printf("%d ",*(p.base+i));

i++;

}

}

}

void CreateStack(SqStack &s){

s.base=(int*)malloc(init_size*sizeof(int));

s.top=s.base;

s.stacksize=init_size;

}

void GetTop(SqStack &s,int &e){

if(s.base==s.top)

printf("这是一个空的栈");

else {

e=*(s.top-1);

printf("栈顶元素为%d\n",e);

}

}

void Push(SqStack &s,int e){

if(s.top-s.base>=s.stacksize)

s.base=(int *)realloc(s.base,(s.stacksize+increasesize)*sizeof(int));

*s.top++=e;

s.stacksize++;

}

void Pop(SqStack &s,int &e){

if(s.base==s.top)

{ p rintf("这是空的栈");e=-1;}

else {

e=*--s.top;

s.stacksize--;

//printf("出栈元素是%d.",e);

}

}

void conversion(int a,int b)

{

SqStack sc;

int e;int sa=a;

CreateStack(sc);

while(a)

{

Push(sc,a%b);

a=a/b;

}

printf("%d转化为%d进制:",sa,b);

int c=sc.top-sc.base;

for(int i=0;i

Pop(sc,e);

printf("%d",e);

}

}

void main()

{

SqStack s;

int data;

int m=4,a,b;

CreateStack(s);

while(m!=0)

{

printf("\n\n选择:1-入栈2-出栈3-转换\t");

scanf("%d",&m);

switch(m)

{

case 1:printf("输入入栈数据:");

scanf("%d",&data);

Push(s,data);

OutPrint(s);

break;

case 2:Pop(s,data);

if(data!=-1)

{

printf("出栈元素是%d.",data);

}

OutPrint(s);

break;

case 3:printf("输入要转换的十进制数以及进制数:");

scanf("%d,%d",&a,&b);

conversion(a,b);

break;

}

}

}

栈的顺序表示和实现

(1)开始界面(2)初始化线性表 3.插入:下面是插入第一个元素的图(3),插入后再一次插入其他元素,最终插完元素,见图(4)

(4)插入最后一个元素(第五个) 5.取栈顶元素,如图( (5)删除栈顶元素(6)取栈顶元素 6.置空顺序栈,如图(7) (7)置空顺序表 7. 数值转换(将一个十进制数转换为任意进制) 三进制数2220。

(9)回文数判断a (10)回文数判断b 实验结论:实验成功 八.我对本次实验的总结: 1.通过对该程序的调试和运行,使的对顺序栈的功能及其构成有了进一步的了解。 2.通过多个函数出现在同一个程序中的实现,便于熟悉全局变量和局部变量在程序中 可以重新熟悉函数在编程中的设置方法

void InitStack(SqStack *p) {if(!p) printf("内存分配失败!"); p->top =-1; } /*入栈*/ void Push(SqStack *p,ElemType x) {if(p->top top =p->top+1; p->stack[p->top]=x; } else printf("Overflow! \n"); } /*出栈*/ ElemType Pop(SqStack *p) {ElemType x; if(p->top>=0) { x=p->stack[p->top]; printf("以前的栈顶数据元素%d已经被删除!\n",p->stack[p->top]); p->top=p->top-1; return(x); } else {printf("Underflow! \n"); return(0); } } /*获取栈顶元素*/ ElemType GetTop(SqStack *p) { ElemType x; if(p->top>=0) { x=p->stack[p->top]; printf("\n栈顶元素为:%d\n",x); return(x); } else { printf("Underflow! \n"); return(0); } } /*遍历顺序表*/ void OutStack(SqStack *p) { int i;

十进制数与十六进制数的转换方法

若十进制数23785转为十六进制,则用23785/16=1486余9,1486/16=92余14,92/16=5余12,5/16=0余5,十六进制中,10对应为a、11对应为b、。。。。。。、15对应为f,再将余数倒写为5ce9,则十进制23785=十六进制5ce9 十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方…… 所以,在第N(N从0开始)位上,如果是是数X (X 大于等于0,并且X小于等于15,即:F)表示的大小为X * 16的N次方。 假设有一个十六进数2AF5, 那么如何换算成10进制呢? 用竖式计算:2AF5换算成10进制: 第0位:5 * 16^0 = 5 第1位:F * 16^1 = 240 第2位:A * 16^2 = 2560 第3位:2 * 16^3 = 8192 + ------------------------------------- 10997 直接计算就是: 5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997 二进制的1101转化成十进制 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13 转化成十进制要从右到左用二进制的每个数去乘以2的相应次方不过次方要从0开始 十进制转二进制:用2辗转相除至结果为1 将余数和最后的1从下向上倒序写就是结果例如302 302/2 = 151 余0 151/2 = 75 余1 75/2 = 37 余1 37/2 = 18 余1 18/2 = 9 余0 9/2 = 4 余1 4/2 = 2 余0 2/2 = 1 余0 1/2 = 0 余1 故二进制为100101110 二进制转八进制 在把二进制数转换为八进制表示形式时,对每三位二进制位进行分组,应该从小数点所在位置分别向左向右划分,若整数部分倍数不是3的倍数,可以在最高位前面补若干个0;对小数部分,当其位数不是的倍数时,在最低位后补若干个0.然后从左到右把每组的八进制码依次写出,即得转换结果. 你算一下就知道了啊比如110=2^2+2+0=6 二进制转十六进制 要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,分的不够的前边补零,用四位数的二进制数来代表一个16进制。转换表如下,括号内为十六进制 0000(0)0001 (1)0010 (2)0011 (3)0100 (4)0101 (5)0110 (6)0111 (7)1000 (8)1001 (9)1010(A)1011 (B)

数据结构课程设计 数制转换 数组和栈

中北大学 数据结构与算法课程设计 说明书 学院、系:软件学院 专业:软件工程 学生姓名:xxx 学号:xxxx 设计题目:数制转换问题 起迄日期: 2013年12月9日- 2013年12月20日指导教师:xxx 2013 年12月 20 日

1、需求分析 任意给定一个M进制的数x ,请实现如下要求 1) 求出此数x的10进制值(用MD表示) 2) 实现对x向任意的一个非M进制的数的转换。 3) 用两种方法实现上述要求(用栈解决和用数组解决)。 2、概要设计 流程图 数组的流程图:

栈的流程图:

算法思想 1、用数组实现该问题: DtoM()函数和MtoD()函数是实现该问题的主要函数。DtoM()函数是实现十进制转换为其它进制的函数,它是将输入的十进制数x取首先对需要转换的进制M取余,然后再对其取整,接着通过递归调用DtoM()函数依次将得到的整数部分依次先取余后取整,并将所得的余数依次存入一个数组中,然后逆向取出数组中的元素,即得到转换后的结果。而MtoD()函数则是实现其他进制M转换为十进制,并将其转换为非M进制的数。M进制转十进制则是从该M进制数的最后一位开始算,依次列为第0、1、2…n位并分别乘以M的0、1、2…n次方,将得到的次方相加便得到对应的十进制数,再调用DtoM()函数将其转换为非M进制的数。 2、用栈实现该问题: 同样是利用DtoM()和MtoD()两个函数实现。两个函数的思想同利用数组实现时相同。只是栈具有后进先出的性质,故其用Pop()取数较数组的逆向取数方便些。 模块划分 1、用数组实现该问题: ⑴i,j,y,n,s,m,r,reminder,x是定义的全局变量,初始值都为0; ⑵DtoM(int g,int h)是实现十进制数转换为M进制数的函数; ⑶MtoD()是实现M(仅指二进制数和八进制数)进制数转换为十进制数的函数,并 在其中调用D2M(int g,int h)实现向非M进制数的转换; ⑷HtoD(int f)是实现十六进制数转换为十进制数的函数,并在其中调用D2M(int g,int h)实现向非十六进制数的转换; ⑸void main()是主函数,功能是给出测试的数据,并在特定条件下调用D2M()

用栈实现把十进制转化为八进制

#include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { int *base; int *top; int stacksize; }sqstack; int InitStack(sqstack &s) { s.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int)); if(!s.base) exit(-1); s.top=s.base; s.stacksize=STACK_INIT_SIZE; return 1; } int Pop(sqstack &s,int &e) { if(s.top==s.base) return 0; e=*--s.top; return 1; } int Push(sqstack &s,int e) { if(s.top-s.base==s.stacksize) { s.base=(int *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(int)); if(!s.base) exit(-1); s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top++=e; return 1; } int StackEmpty(sqstack s) { if(s.top==s.base) return 0; else return 1; }

十进制数与十六进制数的转换方法

一,十进制转换十六进制 若十进制数23785转为十六进制,则用 23785/16=1486余9, 1486/16=92余……14, 92/16=5余………….12, 5/16=0余……………..5,十六进制中,10对应为a、11对应为b、。。。。。。、15对应为f,再将余数倒写为5ce9,则十进制23785=十六进制5ce9 二,十六进制转换十进制 十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方…… 所以,在第N(N从0开始)位上,如果是是数X (X 大于等于0,并且X小于等于15,即:F)表示的大小为X * 16的N次方。 假设有一个十六进数2AF5, 那么如何换算成10进制呢? 用竖式计算:2AF5换算成10进制: 第0位:5 * 16^0 = 5 第1位:F * 16^1 = 240 第2位:A * 16^2 = 2560 第3位:2 * 16^3 = 8192 直接计算就是: 5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997 三,二进制的1101转化成十进制 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13 转化成十进制要从右到左用二进制的每个数去乘以2的相应次方不过次方要从0开始 十进制转二进制:用2辗转相除至结果为1 将余数和最后的1从下向上倒序写就是结果例如302 302/2 = 151 余0 151/2 = 75 余1 75/2 = 37 余1 37/2 = 18 余1 18/2 = 9 余0 9/2 = 4 余1 4/2 = 2 余0 2/2 = 1 余0 1/2 = 0 余1 故二进制为100101110 四,二进制转八进制 在把二进制数转换为八进制表示形式时,对每三位二进制位进行分组,应该从小数点所在位置分别向左向右划分,若整数部分倍数不是3的倍数,可以在最高位前面补若干个0;对小数部分,当其位数不是的倍数时,在最低位后补若干个0.然后从左到右把每组的八进制码依次写出,即得转换结果. 你算一下就知道了啊比如110=2^2+2+0=6 五,二进制转十六进制 要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,分的不够的前边补零,用四位数的二进制数来代表一个16进制。转换表如下,括号内为十六进制 0000(0)0001(1)0010(2)0011(3)0100(4)0101(5) 0110(6)0111(7)1000(8)1001(9)1010(A)1011(B) 1100(C)1101(D)1110(E)1111(F) 例如:10101011划分为1010 1011,根据转换表十六进制为AB

计算机各种进制转换练习题(附答案)

进制转换练习题 1.十进制数1000对应二进制数为______,对应十六进制数为______。 供选择的答案 A:① 1111101010 ② 1111101000 ③ 1111101100 ④ 1111101110 B:① 3C8 ② 3D8 ③ 3E8 ④ 3F8 2.十进制小数为0.96875对应的二进制数为______,对应的十六进制数为______。 供选择的答案 A:① 0.11111 ② 0.111101 ③ 0.111111 ④ 0.1111111 B:① 0.FC ② 0.F8 ③ 0.F2 ④ 0.F1 3.二进制的1000001相当十进制的______。 ① 62 ② 63 ③ 64 ④ 65 4.十进制的100相当于二进制______,十六进制______。 供选择的答案 A:① 1000000 ② 1100000 ③ 1100100 ④ 1101000 B:①100H ②AOH ③ 64H ④10H 5.八进制的100化为十进制为______,十六进制的100化为十进制为______。 供选择的答案 A:① 80 ② 72 ③ 64 ④ 56 B:① 160 ② 180 ③ 230 ④ 256 6.十六进制数FFF.CH相当十进制数______。 ① 4096.3 ② 4096.25 ③ 4096.75 ④ 4095.75 7.2005年可以表示为______ 年。 ① 7C5H ② 6C5H ③ 7D5H ④ 5D5H 8.二进制数10000.00001将其转换成八进制数为______;将其转换成十六进制数为______。 供选择的答案 A:① 20.02 ② 02.01 ③ 01.01 ④ 02.02 B:① 10.10 ② 01.01 ③ 01.04 ④ 10.08 9.对于不同数制之间关系的描述,正确的描述为______。 供选择的答案 A:①任意的二进制有限小数,必定也是十进制有限小数。 ②任意的八进制有限小数,未必也是二进制有限小数。 ③任意的十六进制有限小数,不一定是十进制有限小数。 ④任意的十进制有限小数,必然也是八进制有限小数。 10.二进制整数1111111111转换为十进制数为______,二进制小数0.111111转换成十进制数为______。

栈的应用:数制转换

数制转换: 十进制数N和其它d进制数的转换是计算机实现计算的基本问题,其解决方法很多,其中一种简单方法基于以下原理. N=(N div d)*d+N mod d (其中:div为整除运算,mod 为求余运算.) 例如:10进制数1348转换为8进制为:2504.其运算过程如下: N N div d N mod d 1348 168 4 168 21 0 21 2 5 2 0 2 假设现要编制一个满足下列要求的程序:对于输入的任意一个非负十进制整数,打印输出与其相等的八进制数,由于上述计算过程是从低位到高位顺序产生八进制数的各个位数,而打印输出,一般来说应从高位到低位进行,恰好和计算过程相反.因此,若将计算过程中得到的八进制数的各位顺序进栈,则按出栈序列打印输出的即为与输入对应的八进制数. 算法描述如下: void conversion() { InitStack(s); scanf(" %d",N); while(N) { push(s,n%8) N=N/8; } while(!StackEmpty(s)) { Pop(S,e); printf("%d",e); } } 这个是利用栈的先进后出特性的最简单的例子.在这个例子中,栈操作的序列是直线式的,即先一味地进栈,然后一味的出栈.也许有人会提出疑问:用数组直接实现不也很简单吗?仔细分析上述算法不难看出,栈的引入简化了程序设计的问题,划分了不同的关注层次,使思考的范围缩小了.而用数组不仅掩盖了问题的本质,还要分散精力去考虑数组下标增减等细节. 完整代码实现: #include<iostream> #include<stack> using namespace std; void change(int n,int d)

高中信息技术基础进制转换二进制十进制十六进制转换转化

2进制数转换为10进制 (110)2转化为十进制 10进制整理转换成2进制 于是,结果是余数的倒排列,即为: (37)10=(a5a4a3a2a1a0)2=(100101)2 16进制转化成2进制、2进制转化成16进制 (二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。) 16进制转化成2进制:每一位十六进制数对应二进制的四位,逐位展开。 二进制数转为十六进制:将二进制数转换成十六进制数是将二进数的整数部分从右向左每四位一组,每一组为一位十六进制整数,不足四位时,在前面补0 (FB)16=(1111 ,1011)2 互转

2进制与16进制的关系: 2进制0000 0001 0010 0011 0100 0101 0110 0111 16进制0 1 2 3 4 5 6 7 2进制1000 1001 1010 1011 1100 1101 1110 1111 16进制8 9 A B C D E F 可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为: 3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102 右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制的值即可。 16进制数转换为10进制数 假设有一个十六进数 2AF5, 那么如何换算成10进制呢? 用竖式计算: 2AF5换算成10进制: 直接计算就是: 5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997 (别忘了,在上面的计算中,A表示10,而F表示15) 假设有人问你,十进数 1234 为什么是一千二百三十四? 你尽可以给他这么一个算式: 1234 = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0 如十进制数2039 它可以表示为:2*10^3+0*10^2+3*10^1+9*10^0

数据结构实验报告 栈进制转换

数据结构试验报告栈的应用——进制转换程序

3.出栈程序 int Pop(Stack *s , int *e) { if(s->top == s->base) { return ERROR; } *e = * -- s->top; return OK; } 4.主函数与进制转化 void main() { int N; int a; int e; Stack s; InitStack(&s); Pop(&s , &e); Push(&s ,&e); InitStack(&s); printf("请输入十进制数:"); scanf("%d",&N); printf("要将N转化为几进制?"); scanf("%d",&a); while(N) { e=N%a; Push( &s , &e ); N = N / a ; } while(s.base!=s.top) { Pop(&s ,&e); printf("%d",e); } free(s.base); system("pause"); } 3.源程序 #include #include #include

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define TRUE 1 #define FALSE -1 typedefstruct{ int *base; int *top; intstacksize; }Stack; intInitStack(Stack *s) { s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!s->base) { exit(OVERFLOW); } s->top=s->base; s->stacksize=STACK_INIT_SIZE; return OK; } int Push(Stack *s , int *e) { if(s->top - s->base >= STACK_INIT_SIZE) { s->base=(int *)realloc(s->base , (s->stacksize + STACKINCREMENT) * sizeof(int) ); if(!s->base) { exit(OVERFLOW); } s->top=s->base + STACKINCREMENT; } * s->top ++ = *e; return OK; } int Pop(Stack *s , int *e)

各种进制之间转换方法

各进制转换方法(转载) 一、计算机中数的表示: 首先,要搞清楚下面3个概念 ?数码:表示数的符号 ?基:数码的个数 ?权:每一位所具有的值 请看例子: 数制十进制二进制八进制十六进制 数码0~9 0~1 0~7 0~15 基10 2 8 16 权10o,101,102,…2o,21,22,…8o,81,82,…16o,161,162,…特点逢十进一逢二进一逢八进一逢十六进一 十进制4956= 4*103+9*102 +5*101+6*10o 二进制1011=1*23+0*22 +1*21+1*2o 八进制4275=4*83+2*82 +7*81+5*8o 十六进制81AE=8*163+1*162 +10*161+14*16o

二、各种进制的转换问题 1.二、八、十六进制转换成十进制 2.十进制转换成二、八、十六进制 3.二进制、八进制的互相转换 4.二进制、十六进制的互相转换 1、二、八、十六进制转换成十进制 方法:数码乘以相应权之和 2、十进制转换成二、八、十六进制 方法:连续除以基,直至商为0,从低到高记录余数

3、二进制、八进制的互相转换 方法: ?二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制 ?八进制转换成二进制:用3位二进制数代替每一位八进制数 例(1101001)2=(001,101,001)2=(151)8 例 (246)8=(010,100,110)2=(10100110)2 4、二进制、十六进制的互相转换 方法: ?二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制 ?十六进制转换成二进制:用4位二进制数代替每一位十六进制数 例(11010101111101)2=(0011,0101,0111,1101)2=(357D)16 例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2 三、各种进制数的运算

进制转换练习题及答案

进制转换练习题及答案39 进制转换练习题;姓名成绩;1.完成下列进制转换;(11110111)B=()D=()H;(6DF7)16=()2(143)10=()2(;(110111)2=()10(110111110;(32)10=()16;(1AD)H=()B=()D;每题5分;2、在计算机部,信息的存储和处理都采用二进制,;A.便于存储B数据输入便;C.可以增大计算机存储容量D. 进制转换练习题 姓名成绩 1.完成下列进制转换 (11110111)B=()D=()H (6DF7)16=( )2 (143)10=( )2 (82)10 =()2 (110111)2= ( )10 (1)2 =( )16 (32)10 =()16 (1AD)H =()B = ()D 每题5分 2、在计算机部,信息的存储和处理都采用二进制,最主要的原因是()

A.便于存储B 数据输入便 C.可以增大计算机存储容量D.易于用电子元件实现 3.“半斤八两”指古时候用的是十六进制,一斤是十六两,半斤等于八两,如果是不熟悉十,十六进制之间的转换时,可以借助的工具软件是()(A)画图(B)记事本(C)录音机(D)计算器 4.(2004)10 + (32)16的结果是() A. (2036)10 B. (2054)16 C. (4006)10 D. (0)2 E. (2036)16 5.算式(31)10-(10001)2的运算结果是() A.(1101)2 B (15)10 C (1111)2 D (E)16 6.汉字“人”的码是11001000 1100 1011 ,那么它的十六进制编码是() A.B8 CB B B8 BA C D8 DC D C8 CB 7.(08年10月高考题)二进制数1011与十进制数2相乘的值是()A.(10110)2 B.(11010)2 C (11100)2 D.(11111)2 8.下列数中最大的是() A.1111B B 111D C 1101D D 0AH

进制十进制八进制十六进制转换练习题

进制十进制八进制十六进制转换练习题 TTA standardization office【TTA 5AB- TTAK 08- TTA 2C】

数制及相互转换 进制表示形式R代表任意进制 二进制 B R→十:按权展开求和二→八:三位变一位 八进制O (Q) 十→R:除R取余倒排二→十六:四位变一位 十进制 D 八→二:一位变三位 十六进制H 十六→二:一位变四位 一、单选题 1、下列数据中数值最小的是 A、01110000B B、249D C、125Q D、AAH 2、下列数据中数值最大的是 A、3FH B、64D C、77Q D、111110B 3、下列数据中数值最大的是 A、100H B、100D C、100Q D、100B 4、十进制数24转换成二进制数是 A、11100 B、11010 C、11000 D、10100 5、下列数据中数值最小的是 6、下列数据中数值最大的是 7、下列各数中最大的是 A、 B、D7 H C、214D D、325Q 8、与二进制数100101等值的十进制数是 A、34 B、35 C、36 D、37 9、与十进制数256等值的二进制数是 A、 1000000 B、 C、 D、

10、与十六进制数ACE等值的十进制数是 A、2766 B、 2765 C、2764 D、 2763 11、十六进制数111与八进制数111之和,用八进制数表示为 A、 310 B、 1222 C、 1000 D、 532 12、按某种进制运算2 × 4=12,那么4 × 5为 A、20 B、32 C、24 D、 12 13、若216是某种数制的一个数,它的值与十六进制数8E相等,则该数是()进制数。 A、六 B、八 C、九 D、十 14、下列各数中,属于合法的五进制数的是 A、216 B、 123 C、 354 D、189 15、下列无符号十进制中,能用8位二进制表示的是 A、 257 B、 288 C、 256 D、255 16、无符号二进制数后加上一个0,形成的数是原来的几倍 A、 1 B、 2 C、 1/2 D、4 17、下列数据中数值最大的是 A、(10000)2 B、(17)8 C、(17)10 D、(10)16 18、某学校有1500名学生,若用二进制来编学号,需要多少位来表示。 A、 10 B、 11 C、12 D、13 19、十进制数153转换成二进制数应为 A、 BC、 D、1110110

数据结构 栈十进制转八进制的算法详解(已测试过)

实验目的 建立栈实现十进制转八进制 实验内容 编程序并上机调试运行。 建立栈实现十进制转八进制 1.编写程序 //十进制转八进制 #include #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { int *base; int *top; int stacksize; }sqstack; int initstack (sqstack *s) {s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!s->base) exit(0); s->top=s->base; s->stacksize =STACK_INIT_SIZE ; return 0; }//构造一个空栈s int push(sqstack *s,int e) { if((s->top-s->base)>=s->stacksize){ s->base=(int*)realloc(s->base,(s->stacksize + STACKINCREMENT )*sizeof(int)); if(!(s->base)) exit(1);

s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e; return 0; }//插入新的元素e为新的栈顶元素 int stackempty (sqstack *s) {if(s->top==s->base) return 1; else return 0; }//若栈s为空栈,则返回1,否则返回0 int pop (sqstack *s,int *e) {if(s->top==s->base) return 1; *e=*--s->top; return 0; }//若栈不为空,则删除s的栈顶元素,用e返回其值,返回OK,否则返回ERROR void conversion (int n) { sqstack s; int e; initstack(&s); printf("请输入一个十进制数:\n"); scanf("%d",&n); while (n){ push(&s,n%8); n=n/8; } printf("\n"); printf("该数的八进制数为:\n"); while(!stackempty(&s)){ pop(&s,&e); printf("%d",e); }

进制转换练习题_四川专升本

进制练习题 1、十进制数1000对应二进制数为______,对应十六进制数为______。 供选择的答案 A:① 10 ② 00 ③ 00 ④ 10 B:① 3C8 ② 3D8 ③ 3E8 ④ 3F8 2、十进制小数为对应的二进制数为______,对应的十六进制数为______。 供选择的答案 A:①②③④ B:①②③④ 3、二进制的1000001相当十进制的______,二进制的可以表示为______。 供选择的答案 A:① 62 ② 63 ③ 64 ④ 65 B:① 23+2–3② 22+2–2③ 23+2–2④ 22+2–3 4、十进制的100相当于二进制______,十进制的相当二进制的______。 供选择的答案 A:① 1000000 ② 1100000 ③ 1100100 ④ 1101000 B:① 2–1+2–2+2–4+2–5② 1–(2–3+2–4) ③ 1+(–2–3–2–4) ④ 1–2–3–2–4–2–6 5、八进制的100化为十进制为______,十六进制的100化为十进制为______。 供选择的答案 A:① 80 ② 72 ③ 64 ④ 56 B:① 160 ② 180 ③ 230 ④ 256 7、十六进制数相当十进制数______。 供选择的答案 A:①②③④ 8、 2005年可以表示为______ 年;而37308年是指______ 年。 供选择的答案 A:① 7C5H② 6C5H③ 7D5H④ 5D5H B:① 200010② 200210③ 200610④ 200810 9、二进制数可以表示为______;将其转换成八进制数为______;将其转换成十六进

利用栈实现数制转换(10进制转换8进制)

//利用栈实现数制转换(10进制转换8进制) #include #include #define ERROR 0 #define OK 1 #define STACK_INIT_SIZE 100 //存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 typedef int SElemType; typedef struct stack { SElemType *top; SElemType *bottom; int stacksize; }SqStack; int InitStack(SqStack *S) { //构造一个空栈 S->bottom=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S->bottom) return ERROR; //存储分配失败 S->top=S->bottom; S->stacksize=STACK_INIT_SIZE; return OK; } //InitStack int Push(SqStack *S,SElemType e) { //插入元素e为新的栈顶元素 if(S->top-S->bottom>=S->stacksize-1) { S->bottom=(SElemType*)realloc(S->bottom, (S->stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S->bottom) return ERROR; // S->top=S->bottom+S->stacksize; } *S->top++=e;

计导 课后习题参考答案(第3章分析

第3章数的表示 一、复习题 1.如何把十进制数转换成二进制数? 答:除2逆向取余。 2.如何把二进制数转换成十进制数? 答:将每个二进制位乘以它的位权,将所有结果相加得到对应的十进制数。 3.在二进制系统中,每一位是哪一个数的幂? 答:2。 4.在十进制系统中,每一位是哪个数的幂? 答:10。 5.表示有符号整数有哪三种方法? 答:(1)符号加绝对值(原码)(2)二进制反码(3)二进制补码 6.最大的无符号整数的含义是什么? 答:计算机中分配用于保存无符号整数的二进制位数所确定的最大无符号整数,最大无符号整数取决于计算机中分配用于保存无符号整数的二进制位数N,无符号整数范围:0~ (2N-1)。 7.位数分配指什么? 答:用以表示整数的二进制位数. 8.为什么不可以将十进制数256存储在8位存储单元中? 答:八位存储单元最大存储到255,存储256会产生溢出。 9.试述无符号整数的两种用途? 答:(1)计数。计数时,不需要负数,可以从0或1开始。 (2)寻址。因为地址是从0开始到整个存储器的总字节数的正数。 10.将十进制数130以符号加绝对值表示法存储在8位存储单元中会怎样? 答:会溢出。因为符号加绝对值表示法在八位存储单元中存储数据的的范围是:-127到+127. 11.分析比较正整数在符号加绝对值、二进制反码、二进制补码三种表示法中的异同。 答:没有不同。 12.分析比较负整数在符号加绝对值、二进制反码、二进制补码三种表示法中的异同。 答:相同点:最左边的位定义的都是符号。如果为0,则表示正数,如果为1,则表示负数。

不同点:首先将整数的绝对值转换成二进制数,若是负数,符号加绝对值是将最左边的位置1,其余不变;反码是将所有二进制位中的0变为1。即按位取反。补码是最右边连续的 0和首次出现的1保持不变,其余位逐位取反。 13.分析比较0在符号加绝对值,二进制反码,二进制补码三种表示方法中的异同。 答:符号加绝对值:有两个0,正0(00000000)和负0(10000000) 二进制反码:有两个0,正0(00000000)和负0(11111111) 二进制补码:只有一个0(00000000) 14. 分析比较符号加绝对值,二进制反码,二进制补码三种表示方法中可以表示的数的范围。 答:符号加绝对值:-(2N-1-1)~+( 2N-1-1) 二进制反码:-(2N-1-1)~+( 2N-1-1) 二进制补码:-(2N-1)~+( 2N-1-1) 15.试述最左边一位在符号加绝对值,二进制反码,二进制补码三种表示法中的异同。 答:在三种表示法中,最左边一位都是符号位,0表示正,1表示负。 16.Excess-X系统的最主要用途是什么?x代表什么? 答:用来存储小数的指数值。X代表幻数。幻数是进行数据转换时的基础数据。 17试述规范化的必要性 答:规范化使得浮点数的运算变得更简单。 18.什么是尾数 答:尾数是指浮点数规范化后小数点右边的二进制数,它定义了数的精度。 19.在一个数被规范化后,计算机内存储了哪些信息? 答:只储存了这个数的三部分信息:符号,指数和尾数。 二、选择题 20.在【】系统中只使用0和1。 A.十进制 B.八进制. C.二进制 D.十六进制 21.将二进制数转换成二进制数,需要不断用【】来除这个数. A.2 B.8 C.10 D.16 22.以下三种整数表示法中哪种既可以处理正数又可以处理负数【】 A.符号加绝对值表示法 B.二进制反码表示法 C.二进制补码表示法 D.以上都是 23.在无符号整数中,4位地址分配单元可以表示【】个非负数 A.7 B.8 C.15 D.16 24.在所有的有符号整数表示法中,四位地址分配单元可以表示【】个非负数. A.7 B.8 C.15 D.16

数据结构-栈十进制转八进制的算法详解(已测试过)

数据结构-栈十进制转八进制的算法详解(已测试过)

实验目的 建立栈实现十进制转八进制 实验内容 编程序并上机调试运行。 建立栈实现十进制转八进制 1.编写程序 //十进制转八进制 #include #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { int *base; int *top; int stacksize; }sqstack; int initstack (sqstack *s) {s->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int)); if(!s->base) exit(0); s->top=s->base; s->stacksize =STACK_INIT_SIZE ; return 0; }//构造一个空栈s int push(sqstack *s,int e) { if((s->top-s->base)>=s->stacksize){ s->base=(int*)realloc(s->base,(s->stacksize +

STACKINCREMENT )*sizeof(int)); if(!(s->base)) exit(1); s->top=s->base+s->stacksize; s->stacksize+=STACKINCREMENT; } *s->top++=e; return 0; }//插入新的元素e为新的栈顶元素 int stackempty (sqstack *s) {if(s->top==s->base) return 1; else return 0; }//若栈s为空栈,则返回1,否则返回0 int pop (sqstack *s,int *e) {if(s->top==s->base) return 1; *e=*--s->top; return 0; }//若栈不为空,则删除s的栈顶元素,用e返回其值,返回OK,否则返回ERROR void conversion (int n) { sqstack s; int e; initstack(&s); printf("请输入一个十进制数:\n"); scanf("%d",&n); while (n){ push(&s,n%8); n=n/8; } printf("\n"); printf("该数的八进制数为:\n"); while(!stackempty(&s)){ pop(&s,&e);

数制转换练习答案

数制练习 填空 1. 两个8位二进制数10101011和01001011进行逻辑加的结果为 11101011 。 2. 十六进制数AB.CH对应的十进制数字是 171.75 。 3. 已知一个带符号整数的补码由两个1和六个0组成,则该补码能够表示的最小整数是 -127 。 4. 二进制数10111000和11001010进行逻辑“与”运算,结果再与10100110进行逻辑“或”运算,最终结果的十六进制形式为(10101110 )。 5.Pentium处理器中的一个16位带符号整数,如果它的十六进制表示为FEDCH,那么它的十进制值为(-292)。 5. 对两个逻辑值1施行逻辑加操作的结果是1 。 6. .若A=1100,B=0010,A与B运算的结果是1110,则其运算可以是算术加,也可以是逻 辑加 判断 1.每个十进制整数都可以精确的转换为二进制整数形式。N 2. 一个整数的补码就是其原码除符号位外取反加1。Y 单选 1. 下面关于计算机中定点数与浮点数的一些叙述, 正确的是____B______ A. 定点数只能表示纯小数 B. 浮点数尾数越长, 数的精度就越高 C. 定点数的数值范围一定比浮点数的数值范围大 D. 定点数就是用十进制表示的数 2. 下列有关" 权值" 表述正确的是____B______ A. 权值是指某一数字符号在数的不同位置所表示的值的大小 B. 二进制的权值是" 二", 十进制的权值是" 十" C. 权值就是一个数的数值 D. 只有正数才有权值 3. 下列有关" 基数" 表述正确的是____B______ A. 基数是指某一数字符号在数的不同位置所表示的值的大小 B. 二进制的基数是" 二”,十进制的基数是" 十" C. 基数就是一个数的数值 D. 只有正数才有基数 4. 十进制数"13", 用三进制表示为____C______ A.lOl B.110 C.111 D.112 5. 下列各数都是五进制数, 其中____B______对应的十进制数是偶数。 A.111 B. 101 C.131 D.100 6. 一个某进制的数"lAl”,其对应十进制数的值为300, 则该数为 C A. 十一进制 B.十二进制 C. 十三进制 D. 十四进制

C语言 用栈实现进制转换

C语言用栈实现进制转换 #include #include #include #include #define S_SIZE 100 //栈所占空间的大小 #define STACKINCREAMENT 10 //扩充空间时一次扩充十个字节struct SqStack { int *base; //栈底 int *top; //栈顶 int stacksize;//栈当前的存储空间 }*S; //主函数开始 void main() { //子函数声明 void InitStack(S);//初始化空栈 int StackEmpty(SqStack S);//判栈空 void GetTop(SqStack S,int &e);//获得栈顶元素 void push(SqStack &S,int e);//进栈 void pop(SqStack &S,int &e);//出栈 void convert(SqStack &5,int N,int n);//十进制转N进制 int i,num; unsigned n,N;//要转换的进制数及要转换的数 SqStack s; InitStack(s);//初始化空栈 printf("输入要转换的十进制数和要转换为的进制数:\n"); scanf("%d,%d",&N,&n); printf("%d转换为%d进制后为:\n",N,n); convert(s,N,n); } void InitStack(SqStack &S) { S.base = (int *)malloc(S_SIZE*sizeof(int)); S.stacksize=S_Size; S.top=S.base;//初始化空栈 } int StackEmpty(SqStack S) {

相关主题
文本预览
相关文档 最新文档