您的位置:首页 > 其它

将十进制数转换为任意进制数

2016-07-22 20:40 288 查看
问题:将十进制数转换为任意进制数(2,8,16...).

 

算法:假如N为输入的数,n为要转换为的进制,若要将十进制231转换为8进制数,过程如下;

N                        N/n                      N%n

231                   28                         7

28                      3                           4

3                        0                           3

则输出为347,可以看出,首先得到的应该是7,然后才是4,最后是3,但是要逆序显示,自然就类似压栈出栈的数据结构了(数组也可以实现,但是没有体现其本质).

所以,只需要初始化栈后,将N%n不断的压入栈底,需要注意的是如果要转换为16进制,则需要对大于9的数字作字符处理。

[cpp] view
plain copy

 print?

/*栈的基本操作*/  

#include <stdio.h>  

#include <malloc.h>   //malloc,realloc  

#include <math.h>     //含有overflow  

#include <process.h>  

#define S_SIZE 100   //栈的空间大小  

#define STACKINCREAMENT 10//增加空间  

struct SqStack{  

 int *base; //栈底  

 int *top;  //栈顶  

 int stacksize;   //栈当前的存储空间  

};  

//主函数开始  

void main()  

{//子函数声明  

void InitStack(SqStack &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 &S,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)  

{  

   if(S.base==S.top)  

       return 1;  

   else  

       return 0;  

}  

void GetTop(SqStack S,int &e)  

{//获得栈顶元素  

    e=*(S.top-1);  

}  

void push(SqStack &S,int e)  

{//进栈  

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

  {S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));  

  S.top=S.base+S.stacksize;  

  S.stacksize+=STACKINCREAMENT;}  

  *(S.top)=e;  

  S.top++;      

}  

void pop(SqStack &S,int &e)  

{//出栈  

 if(S.base!=S.top)  

 {S.top--;  

 e=*S.top;}  

}  

void convert(SqStack &S,int N,int n)  

{  

  InitStack(S);  

  do   

  {push(S,N%n);  

  N/=n;  

  } while (N!=0);  

  int i,e;  

  while(!StackEmpty(S))  

  { pop(S,e);  

    if(e>9)//十六进制时输出字母  

    {e=e+55;  

    printf("%c",e);}  

    else  

    printf("%d",e);  

  }  

  printf("\n");  

}  

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: