十进制数转换成x进制栈实现
题目:输入一个十进制数n,以及要求转换成的进制x,输出x进制下的n.用栈实现.约定输入的数为正整数,进制x为2-36,输出的x进制数有0-9十个数字及26个大写字母组成.
分析:进制转换中很简单的一个,用数n不断除x,并将商赋给n,直到n变为0,在这个不断相除的过程中,每一次相除都会产生一个余数,把余数依次排列,逆序组成的数就是x进制下的n了.这个原理大家应该知道的.可以用数组,实现此题.但,栈的原理是后进先出,此题也就是要逆序输出.不过.这个栈的函数模版,要自己写吗?不知道有木有只要加一个头文件就可以用栈函数的呢...不过,不得不说,栈真的很强大....哈哈.... 栈的初学者....
代码:
// 这是个用栈把十进制数n转换成x进制的数的程序,默认输入的数是正整数
// 转换的进制在2-36之间,有0-9以及26个大写字母来表示
#include<stdio.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OVERFLOW -2
#define ERROR 0
#define OK 1
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
typedef int Status;
Status InitStack(SqStack &S) //构造空栈
{
S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &S,int e) //插入元素e为新的栈顶元素
{
if(S.top-S.base>=S.stacksize)
{
S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status StackEmpty(SqStack S) //判断是否为空栈
{
if(S.top==S.base)
return 1;
else
return 0;
return OK;
}
Status Pop(SqStack &S,int &e) //删除栈顶元素并用e返回其值
{
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
int main()
{
printf("这是个把十进制数n转换成x进制的数的程序:\n");
printf("\n请输入十进制数n:\n");
int n,m;
SqStack S;
int e;
InitStack(S);
while(scanf("%d",&n)!=EOF)
{
printf("请输入要转换的进制x:\n");
int x;
scanf("%d",&x);
m=n;
while(n)
{
Push(S,n%x);
n/=x;
}
printf("十进制数%d转换成%d进制为:\n",m,x);
while(!StackEmpty(S))
{
Pop(S,e);
if(e>=10)
printf("%c",e-10+'A');
else
printf("%d",e);
}
printf("\n\n请输入十进制数n:\n");
}
return 0;
}