利用栈将任意非负十进制数转换成十六进制

利用栈将任意非负十进制数转换成十六进制... 利用栈将任意非负十进制数转换成十六进制 展开
 我来答
匿名用户
推荐于2018-04-24
展开全部
var
 x:longint;
 z:array[1..100] of byte;
 top:byte;
 y,modd:byte;
procedure push;
begin
 inc(top); z[top]:=modd;
end;
procedure pop;
begin
 if top>0 then begin y:=z[top]; dec(top); end
 else writeln('stack overflow !');
end;
begin
 x:=1234567890;
 top:=0;
 repeat
  modd:=x mod 16;
  x:=x div 16;
  push;
 until x=0;
 
 while top>0 do begin
  pop;
  if (y>=10) then write(chr(y-10+ord('A')):1)
  else write(chr(y+ord('0')):1);
 end;
end.
好程序员
2016-04-11 · HTML5前端培训/大数据培训/Java
好程序员
好程序员是IT高端课程培训基地,从平凡到卓越,为梦想而拼搏。
向TA提问
展开全部
主要思想:

1)由于在C语言中没有对十六进制类型的变量,所以输入的十六进制数应如何处理以确保存储在内存中仍保持十六进制?
基于这一原因,只能以字符串的形式来存储输入的十六进制数,即把数作为字符存入内存。
2)为了实现转换,将输入的一串字符一个一个地入栈,用栈的好处是什么?
好处是:不用判断输入的这个十六进制数是几位数,而且栈顶就是个位数字(当然也很容易判断是几位数:字符串的长度就是十六进制数的位数);
3)算法实现:设转换后的十进制为Dec(初值为0)、设i=0(且i<字符串的长度,这个长度不是额外求的,而是在入栈的同时计算来的);将栈中的字符一个一个出栈,每出栈一个字符c就判断它是(‘0’~‘9’)、还是(‘A’~‘F’)或是(‘a’~‘f’):
①若c是(‘0’~‘9’),则转换时按下述原则进行:Dec=Dec+(c-48)*16n;
②若c是(‘A’~‘F’),则转换时按下述原则进行:
若c=’A’,则Dec=Dec+10*16n;
若c=’B’,则Dec=Dec+11*16n;
若c=’C’,则Dec=Dec+12*16n;
若c=’D’,则Dec=Dec+13*16n;
若c=’E’,则Dec=Dec+14*16n;
若c=’F’,则Dec=Dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
    Dec=Dec+((c-65)+10)*16n;
③若c是(‘a’~‘f’),则转换时按下述原则进行:
若c=’a’,则dec=dec+10*16n;
若c=’b’,则dec=dec+11*16n;
若c=’c’,则dec=dec+12*16n;
若c=’d’,则dec=dec+13*16n;
若c=’e’,则dec=dec+14*16n;
若c=’f’,则dec=dec+15*16n;
说明:不这样做也可以,用一个表达式表示上面的6个式子,如下:
    dec=dec+((c-97)+10)*16n;
#include "stdio.h"
#include "math.h"
typedef char datatype; /*定义栈的数据结构*/
typedef struct
{datatype data[100];
int top;
}SQstack;
void push(SQstack *s,datatype e) /*入栈操作*/
{(*s).top++;
(*s).data[(*s).top]=e;
}
datatype pop(SQstack *s,datatype *e) /*出栈操作*/
{*e=(*s).data[(*s).top];
(*s).top--;
return (*e);}
void initstack(SQstack *s)  /*建空栈*/
{(*s).top=-1;
}
int emptystack(SQstack s)  /*判断栈是否为空*/
{if(s.top==-1) return 1;
else return 0;
}
datatype gettop(SQstack s)  /*取栈顶元素、并返回*/
{if(emptystack(s)) return NULL;
else return s.data[s.top];
}
trans16_10()      /*输入十六进制数、入栈、出栈并判断转换*/
{SQstack *s;
char e,ch[100],c;
int i=0,j;
double Dec=0,x;
clrscr();
initstack(s);
ch=getchar();       /*输入的十六进制数用ch接收*/
while(ch!='#')  /*入栈、i表示字符串的长度、以’#’为结束输入标志*/
{push(s,ch);
i++;
ch=getchar();}
j=0;
while(j<i) /*出栈并判断转换*/
{c=pop(s,&e);   /*注意:这里必须使用中间变量c,因下面程序的每个if的条件部分要两次用到同一个栈顶c*/
if(c>='0' && c<='9')
Dec+=(c-48)*pow(16,j);
else if(c>='a' && c<='f')
switch(c)
{case 'a':Dec+=10*pow(16,j);break;
case 'b':Dec+=11*pow(16,j);break;
case 'c':Dec+=12*pow(16,j);break;
case 'd':Dec+=13*pow(16,j);break;
case 'e':Dec+=14*pow(16,j);break;
case 'f':Dec+=15*pow(16,j);break;
}
else if(c>='A' && c<='F')
switch(c)
{case 'A':Dec+=10*pow(16,j);break;
case 'B':Dec+=11*pow(16,j);break;
case 'C':Dec+=12*pow(16,j);break;
case 'D':Dec+=13*pow(16,j);break;
case 'E':Dec+=14*pow(16,j);break;
case 'F':Dec+=15*pow(16,j);break;
}
j++;
}
return Dec;
}
void main()
{ double Dec;   Dec=trans16_10();
printf("\n%.0lf",Dec); }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式