c语言二进制转换十进制_用‘栈的思想编写一个十进制转换二进制、八进制或十六进制的程序...

用‘栈’的思想编写一个十进制转换二进制、八进制或十六进制的程序

根据进制转换方法,如十进制向二进制转换,将转换的十进制整数除以二进制基数(2),得到余数和商,如果商不为0,该商继续做被除数,除以基数,得到余数和商,此过程一直进行,直到得到的商为0时停止,此时得到的所有余数逆序排列就是转换得到的二进制数。十进制转换其他进制(八、十六)方法和当前方法相同,故可以扩展得到十进制向二、八、十六进制转换的统一算法。由于十进制数转换其他进制数时符合栈的特点“先进后出”,即先得到的余数是低位,后得到的余数是高位,因此这里利用栈做工具,保存转换过程中得到的余数。这里的栈需要自己定义,可以定义顺序栈,也可以定义链栈。可以将栈的定义及其基本操作放在一个头文件中,如果哪个程序需要就可以包含该头文件,而不需要每次都重新编写栈的代码。

首先运用顺序栈

头文件
#include #define MAX 100typedef int SElemType;typedef struct{ SElemType   base[MAX];   // 栈底指针 int  top;                // 栈顶指针                          //当前已分配的存储空间,以元素为单位。}SqStack;bool InitStack( SqStack &s ){        // 初始化顺序栈, 构造一个空栈 s.top =-1; return true;}// InitStackbool Push(SqStack &s,SElemType e){        //把元素e入栈   if( s.top ==MAX-1)     // 若栈满,返回false       return false;    s.top++;  s.base[s.top]= e;  return true;     }// Pushbool Pop( SqStack &s, SElemType &e ){        // 出栈 if( s.top == -1)     // 空吗?   return false; e = s.base[s.top];  s.top --; return true;}// Popbool StackEmpty(SqStack s){        //判栈空   return(s.top==-1);}

主程序

#include #include"shujujiegou_shunxuzhan.h"void conversion (int N,int B) {     SqStack S;    int temp,x;    InitStack(S); // 构造空栈    while (N)  {           temp=N%B;   Push(S,temp);   N=N/B; } while (!StackEmpty(S))     {      Pop(S,x);        switch(x)  {  case 10:putchar('A');break;  case 11:putchar('B');break;  case 12:putchar('C');break;  case 13:putchar('D');break;  case 14:putchar('E');break;  case 15:putchar('F');break;  default :printf("%d",x);//x<=9时原样输出  }   } printf("\n");} // conversionint main(){     int m,n;     printf("这是一个十进制数转化为二进制数、八进制数及十六进制数的演示程序……\n");     printf("请输入十进制数:");     scanf("%d",&m);     printf("\n");     printf("请输入你想将十进制转换成的进制:");     scanf("%d",&n);     printf("十进制的%d转换成%d进制的数是:",m,n);     conversion(m,n);     printf("\n");     return 0;}

链栈

头文件
#include typedef char ElemType ;typedef struct linknode{    ElemType data;    struct linknode *next;  }LiStack;  void InitStack(LiStack * &s);//构造空栈  void DestoryStack(LiStack * &s);//销毁栈  bool StackEmpty(LiStack * s);//判栈空  void Push(LiStack * &s, ElemType e);//压栈  bool Pop(LiStack * &s, ElemType &e);//出栈  bool GetTop(LiStack * s, ElemType &e);//取栈顶元素  void InitStack(LiStack * &s){      s = (LiStack * )malloc(sizeof(LiStack));   s -> next = NULL;   }   void DestoryStack(LiStack * &s){       LiStack * p = s, *q = s -> next;   while(q != NULL)    {           free(p);             p = q;           q = p -> next;    }   }   bool StackEmpty(LiStack * s){    return (s -> next == NULL);}void Push(LiStack * &s, ElemType e){    LiStack * p;    p = (LiStack *)malloc(sizeof(LiStack));    p -> data = e;    p -> next = s -> next;    s -> next = p;}bool Pop(LiStack * &s, ElemType &e){    LiStack * p;    if(s -> next == NULL)        return false;    p = s -> next;    e = p -> data;    s -> next = p -> next;    free(p);    return true;}bool GetTop(LiStack * s, ElemType &e){    if(s -> next == NULL)        return false;    e = s -> next -> data;    return true;}

程序代码

#include#include#include"shujujiegou_lianzhan.h"void   trans(int a,int b){     LiStack * s;    InitStack(s);    int yu;    ElemType e;    while(a)     {        yu = a % b;        if(yu >= 10)         {            ElemType p = yu + 'A' - 10;//转换为对应字符的ASCII值            Push(s, p);        }        else         {            ElemType p = yu + '0';//转换为对应数字字符的ASCII值            Push(s, p);        }        a /= b;    }        while(!StackEmpty(s))    {        Pop(s, e);        printf("%c", e);    }    printf("\n");    DestoryStack(s);}int main(){    int n;    while(1)    {    printf("————十进制向二进制、八进制、十六进制转换器—————\n\n");    printf("请输入一个十进制数(要求大于或等于零,其他则退出!):");    scanf("%d", &n);    if(n<0) break;    printf("十进制数%d转换为二进制数为:",n);    trans(n,2);    printf("十进制数%d转换为八进制数为:",n);    trans(n,8);    printf("十进制数%d转换为十六进制数为:",n);    trans(n,16);    system("pause");//暂停作用,包含在stdlib.h中    system("cls");//清屏作用,包含在stdlib.h中       }        return 0;}

运行结果图

9c7ecc3e6733d3f0bbb5da848056b229.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值