数值进制转换问题

问题描述:

对于键盘输入的任意一个非负十进制整数,打印出与其相等的八进制数。由于上述计算过程是从低位到高位顺序产生的八进制数的各个位,再打印输出,而人类习惯,应从高位到低位进行,恰好与计算过程相反。因此可以先将计算过程中得到的八进制数的各位进栈,等到相对应的八进制数的各位产生后,再按顺序出栈,打印输出,即得到与输入的十进制相对应的八进制。

解决思路:

  • 将十进制数N和其他d进制之间进行转换时计算机实现计算的基本问题,解决方案较多,其中最简单的方法是除d取余法,例如,(1348)10=(2504)8。

过程如:

N N div 8 N mod 8
1348 168 4
168 21 0
21 2 5
2 0 2
  • 即 十进制数 1348 转化为 八进制数 后为 2504

可以看出,最先产生的余数4是转换结果的最低位,这正好符合栈“LIFO”特性,所以可以用顺序栈来模拟该过程。
C语言创建一个栈的详细过程

代码:

在操作过程的任何状态下都有可能的操作:“入”和“出”。每个状态下处理问题的方法都是相同的,这说明该问题具有递归性质,可以考虑递归算法实现。输入序列可以仅由一对整型变量表示,用栈实现。

#include 
#include 
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int ElemType;
typedef struct
{
     	ElemType *base;  //基指针 
	ElemType *top;  //栈顶指针 
	int stacksize; //当前空间 
} SqStack;

 int InitStack(SqStack &s)  //栈的初始化 
{
     
 	s.base = (ElemType *) malloc(STACK_INIT_SIZE*sizeof(ElemType));
 	if(!s.base)
	 	return 0;
 	s.top = s.base;
 	s.stacksize = STACK_INIT_SIZE;
 	return 1;
} 
 int Push(SqStack &s, ElemType e) //栈的插入 
{
     
	if(s.top - s.base >= s.stacksize)
	{
     
		s.base = (ElemType *) realloc(s.base, (s.stacksize+STACKINCREMENT) * sizeof(ElemType));
		if(!s.base)
			return 0;
		s.top = s.base + s.stacksize;
		s.stacksize += STACKINCREMENT;
	}
		* s.top++ = e;
	return 1;
}
 int Pop(SqStack &s, ElemType &e) //栈的删除 
{
     
	if(s.top == s.base) return 0;
	e = *--s.top;
}

//2进制转换函数: 
void tran_2(SqStack s, ElemType N)  
{
       
	ElemType e;
   	while(N)
	{
     
   		Push(s, N%2);
   		N = N/2;
    }
  
   while(s.base != s.top)
   {
     
   		Pop(s,e);
   		printf("%d",e);
   }	
}
 
//8进制转换函数 : 
void tran_8(SqStack s,ElemType N) 
{
       
	ElemType e;
   while(N)
   {
     
   		Push(s,N%8);
   		N = N/8;
   }
   
   while(s.base!=s.top)
   {
     
   		Pop(s,e);
   		printf("%d",e);
   }	
}

//16进制转换函数 :
void tran_16(SqStack s,ElemType N) 
{
       
	ElemType e;
   while(N)
   {
      
   		if(N%16<10)
   			Push(s,N%16);
   		else
   	 	{
      
			switch(N%16)
   	   		{
      
					case 10:Push(s,65);break;
   	   				case 11:Push(s,66);break;
   	   				case 12:Push(s,67);break;
   	   				case 13:Push(s,68);break;
   	   				case 14:Push(s,69);break;
   	   				case 15:Push(s,70);break;  	   	
		    }	
		}
   	N=N/16;
   } 
   while(s.base!=s.top)
   {
     	
   		if(*(s.top-1)>=0&&*(s.top-1)<10)
   		{
       
			Pop(s,e);
   	   		printf("%d",e);
	   	}
	   else
	   {
      
	   		Pop(s,e);
	     	printf("%c",e);
	   }
   }	
}
int main()
{
       
	SqStack s;
    int choose; 
    ElemType N;
    InitStack(s);
    
    printf("输入十进制数:");
    scanf("%d",&N);
    
    printf("\n输入要转换的进制数:");
    scanf("%d",&choose);
    
   switch(choose)
   {
     
   		case 2:tran_2(s,N);break;
   	 	case 8:tran_8(s,N);break;
   	 	case 16:tran_16(s,N);break; 
		return 0;
   }
}

你可能感兴趣的:(C数据结构学习笔记,c语言,数据结构)