实验内容:任意输入一个十进制整数n,要求借助栈将其转换为对应的r进制整数并输出。
#include<>
#include<>
typedef int ElemType;
typedef struct //声明顺序栈
{
ElemType data[100];
int top;
}SqStack;
void main()
{
void InitStack(SqStack *&s); //初始化栈
void Push(SqStack *&s,int n,int r); //进栈
void Pop(SqStack *&s); //出栈
int n,r;
SqStack *s;
printf("请输入一个10进制数字\n");
scanf("%d",&n);
printf("请输入所要转换的进制\n");
scanf("%d",&r);
InitStack(s);
if(n==0)
printf("%d的%d进制为0",n,r);
else
{
Push(s,n,r);
Pop(s);
}
}
void InitStack(SqStack *&s) //初始化栈
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
void Push(SqStack *&s,int n,int r) //进栈
{
while(n)
{
s->top++;
s->data[s->top]=n%r;
n=n/r;
}
}
void Pop(SqStack *&s) //出栈
{
ElemType e;
printf("转换所得数为:");
while(s->top!=-1)
{
e=s->data[s->top];
s->top--;
if(e<10)
printf("%d",e);
else
printf("%c",e+55);
}
printf("\n");
}
请输入一个10进制数
1234
请输入所要转换的进制
8
转换所得数为:2322
附:解题分析
将一个十进制整数 N 转换为 r 进制的数,其转换方法为辗转相除法。以 N=1234,r=8 为例,转换方法如下。
辗转相除法步骤如下
(1)初始化一个栈(顺序栈或链栈均可),输入N和r;
(2)判断N的值,为0时转(4),否则将 N % r所得结果压入栈中;
(3)用N / r代替N,转(2);
(4)将栈中所有元素出栈,出栈序列即为结果。