本题易错的地方为对n的值的判断,分为三种情况:第一种为n大于零,这时可直接进行进制转换运算;第二种为n等于零,此时无论n转换成几进制,输出都为0;
第三种为n小于零,此时可以先把n的值大于零,赋给另一变量,到下面再判断n是否大于零,若大于零则输出“-”。还有一难点为当转换为十一到十六进制是的字母,这一点在程序中表现得很明显了。读者自行判断。
下面是代码:
#include <stdio.h>
#include <stdlib.h>
#define Stack_init_size 1000000
#define Stackincrement 1000000
typedef int Selement;
typedef struct
{
Selement *base;
Selement *top;
int Stacksize;
}Sqstack;
int Initstack(Sqstack *S)//一如既往的初始化
{
S->base=(Selement *)malloc(Stack_init_size*sizeof(Selement));
if(!S->base)return -1;
S->top=S->base;
S->Stacksize=Stack_init_size;
return 1;
}
int Push(Sqstack *S,int e)//进栈函数
{
if(S->top-S->base>S->Stacksize)//判断内存是否充足
{//若不充足则重新分配内存
S->base=(Selement *)realloc(S->base,(S->Stacksize+Stackincrement)*sizeof(Selement));
if(!S->base)return -1;
S->top=S->base+S->Stacksize;
S->Stacksize+=Stackincrement;
}
*S->top++=e;//此处注意++的位置
return 1;
}
int Pop(Sqstack *S)//出栈函数
{//用传统方式写在此编译器中不可,另换方法,异曲同工
int e;
if(S->base==S->top)return -1;
e=*--S->top;
return e;
}
int Emptystack(Sqstack *S)//判断栈是否为空
{
if(S->base==S->top)return 1;
else return 0;
}
int Change(Sqstack *S,int n,int r)//转换函数
{
if(r<2||r>16||r==10)return -1;//判断r输入是否合法
int i=0,j;//i为标记变量
int m;//m为n的转换变量
if(n<0)//判断n的正负
{
m=-n;
}
else if(n>0)m=n;
else if(n==0)//不要忘记n为0时的情况
{
printf("0");
return 1;
}
while(m)//分解
{
Push(S,m%r);
m=m/r;
}
while(!Emptystack(S))
{//判断栈中是否还有元素
if(n<0)//判断n的大小,确定输出格式
{
if(i==0)//标记变量,标记n
{
i=1;
printf("-");
}
j=Pop(S);//直接用此函数不可以,
//所以先传递给一个整型变量
if(j>=10)
{
printf("%c",j+55);
//若大于10,则按照转换规则,转换为字符
}
else printf("%d",j);
}
else
{
j=Pop(S);
if(j>=10)
{
printf("%c",j+55);
}
else printf("%d",j);
}
}
return 1;
}
int main()
{
int n,r;
Sqstack S;
while(~scanf("%d%d",&n,&r))
{
Initstack(&S);
Change(&S,n,r);
printf("\n");
}
return 0;
}
此代码在codeblocks环境中