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

来源:互联网 发布:java二维数组意思 编辑:程序博客网 时间:2024/05/23 10:50

问题:将十进制数转换为任意进制数(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?
  1. /*栈的基本操作*/  
  2. #include <stdio.h>  
  3. #include <malloc.h>   //malloc,realloc  
  4. #include <math.h>     //含有overflow  
  5. #include <process.h>  
  6. #define S_SIZE 100   //栈的空间大小  
  7. #define STACKINCREAMENT 10//增加空间  
  8. struct SqStack{  
  9.  int *base; //栈底  
  10.  int *top;  //栈顶  
  11.  int stacksize;   //栈当前的存储空间  
  12. };  
  13. //主函数开始  
  14. void main()  
  15. {//子函数声明  
  16. void InitStack(SqStack &S);//初始化空栈  
  17. int StackEmpty(SqStack S);//判空  
  18. void GetTop(SqStack S,int &e);//获得栈顶元素  
  19. void push(SqStack &S,int e);//进栈  
  20. void pop(SqStack &S,int &e);//出栈  
  21. void convert(SqStack &S,int N,int n);//十进制转N进制  
  22. int i,num;  
  23. unsigned n,N;//要转换成的进制数和要转换的数  
  24. SqStack s;  
  25. InitStack(s);//初始化空栈  
  26. printf("输入要转换的十进制数和要转换为的进制数:\n");  
  27. scanf("%d,%d",&N,&n);  
  28. printf("%d转换为%d进制后为:\n",N,n);  
  29. convert(s,N,n);  
  30. }  
  31. void InitStack(SqStack &S)  
  32. {S.base=(int *)malloc(S_SIZE*sizeof(int));  
  33.  S.stacksize=S_SIZE;  
  34.  S.top=S.base;//初始化空栈  
  35. }  
  36. int StackEmpty(SqStack S)  
  37. {  
  38.    if(S.base==S.top)  
  39.        return 1;  
  40.    else  
  41.        return 0;  
  42. }  
  43. void GetTop(SqStack S,int &e)  
  44. {//获得栈顶元素  
  45.     e=*(S.top-1);  
  46. }  
  47. void push(SqStack &S,int e)  
  48. {//进栈  
  49.   if(S.top-S.base>=S.stacksize)  
  50.   {S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));  
  51.   S.top=S.base+S.stacksize;  
  52.   S.stacksize+=STACKINCREAMENT;}  
  53.   *(S.top)=e;  
  54.   S.top++;      
  55. }  
  56. void pop(SqStack &S,int &e)  
  57. {//出栈  
  58.  if(S.base!=S.top)  
  59.  {S.top--;  
  60.  e=*S.top;}  
  61. }  
  62. void convert(SqStack &S,int N,int n)  
  63. {  
  64.   InitStack(S);  
  65.   do   
  66.   {push(S,N%n);  
  67.   N/=n;  
  68.   } while (N!=0);  
  69.   int i,e;  
  70.   while(!StackEmpty(S))  
  71.   { pop(S,e);  
  72.     if(e>9)//十六进制时输出字母  
  73.     {e=e+55;  
  74.     printf("%c",e);}  
  75.     else  
  76.     printf("%d",e);  
  77.   }  
  78.   printf("\n");  
  79. }  

0 0
原创粉丝点击