进制转换就是将十进制数转换成相应的二进制、八进制和十六进制。原理是将十进制模二进制或者八进制或者十六进制所得的余数按从低到高的顺序入栈后,再按从高到底的顺序出栈,就可以将要得到的进制数输出。
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <stdbool.h> #define STACK_INIT_SIZE 100 //存储空间初始分配 #define STACKINCREMENT 10 //存储空间非配总量 typedef int SElemType; typedef int Status; typedef struct stack { int *base; int *top; int stacksize; }Sqstack,*PSqstack; /*************************************** 操作功能:初始化栈 ***************************************/ PSqstack Init_stack(PSqstack S) { S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S->base) { printf("内存分配失败\n"); exit(-1); } S->top = S->base;//不要写成S->base = S->top S->stacksize = STACK_INIT_SIZE; return S; } /***************************************** 操作功能:判断栈是否为空 *****************************************/ bool is_empty(PSqstack S) { if(S->top == S->base) return true; else return false; } /***************************************** 操作功能:销毁栈 *****************************************/ int DestroyStack(PSqstack S) { if(!S->base) exit(-1); S->stacksize = 0; free(S->base); free(S->top); printf("栈销毁成功\n"); return 0; } /***************************************** 操作功能:入栈 *****************************************/ int Push(PSqstack S,int e) { if(S->top - S->base >= S->stacksize) { S->base = (SElemType *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(SElemType)); if(!S->base) { printf("内存分配失败\n"); exit(-1); } S->top = S->base + S->stacksize; S->stacksize += STACKINCREMENT; } *S->top ++ = e; return 0; } /******************************************** 操作功能:出栈 ********************************************/ int Pop(PSqstack S,int *val) { if(S->base == S->top) { printf("出栈失败"); exit(-1); } S->top --; *val = *(S->top) ; return 0; } /******************************************** 操作功能:取栈顶元素 ********************************************/ int GetTop(PSqstack S,int *val) { if(S->base == S->top) { printf("出栈失败"); exit(-1); } *val = *(S->top -1) ; return 0; } /******************************************** 操作功能:遍历栈 ********************************************/ int Traverse(PSqstack S) { int *p,i; if(S->top == S->base) { printf("遍历失败\n"); exit(-1); } p = S->top - 1; while(p >= S->base) { printf("%d ",*p); p--; } printf("\n"); return 0; } /********************************************* 操作功能:十进制转化成二、八、十六进制 参数说明:S表示一个栈, val_1表示十进制数 val_2表示要转化的进制数 *********************************************/ int transfer(PSqstack S,int val_1,int val_2) { int *val; while(val_1)//循环,直到n等于0为止 { Push(S,val_1 % val_2); //将val_1 / val_2 的余数入栈,先压入的是低位,后压入的是高位。 //利用栈的先进后出的特性 val_1 = val_1 / val_2; //利用val_1 等于val_1 除以val_2的商进入下一次循环 //只要val_1不等于零,就会一直循环 } //此时val_1等于0 while(!is_empty(S))//利用栈是否为空作为判断条件 { Pop(S,val); //十六进制中,将10~15转换成A~F if(val_2 == 16 && *val >= 10) { switch(*val) { case 10:printf("A");break; case 11:printf("B");break; case 12:printf("C");break; case 13:printf("D");break; case 14:printf("E");break; case 15:printf("F");break; } } else printf("%d",*val); } printf("\n"); return 0; } int main() { unsigned int decimal,X;//decimal表示十进制数,X表示某进制数 Sqstack s; PSqstack S; S = Init_stack(&s); printf("请输入十进制数:\n"); scanf("%u",&decimal);//%u表示无符号十进制数 printf("请输入要转换的进制数:"); scanf("%u",&X);//X表示二进制、八进制、十六进制 transfer(S,decimal,X); system("pause"); return 0; }