对于进制转换问题的思考和解决(C语言)

给定一个十进制整数X和要转换的进制m,编程将X以m进制形式输出?

m=2,8,16;

解答:

思想:由一个十进制整数到转换后m进制的整数,计算机是不知道,但是我们知道,我们告诉计算机如何去做,计算机把结果告诉我。

首先,你得要知道如何转换进制,举个例子:将10(十进制)转换二进制数

 得出的二进制数为1010

其他进制也是一样求法;

每次除后得到余数按顺序写出,它不是要求的结果,而是倒过来的要求的结果。如求出是1234,但是结果是4321;这时就在想如何解决这个问题呢?这时我们就想到栈这个数据结构。如果我们把数据入栈,然后在出栈,不就我们的结果吗;

#include<stdio.h>
#define  MAXSIZE  100
typedef   struct
{
    int*  top;
    int*  base;
    int  stacksize;
}SqStack;
void  JingZhiZhuanHuan(SqStack  *S,int  data,int  m);
void  DaYingShuJu(SqStack  *S);
int   main(void)
{
    int  data;
    int  m;
    SqStack   S;
    S.base=(int*)malloc(MAXSIZE*sizeof(int));
    S.top=S.base;
    scanf("%d%d",&data,&m);             //输入要转化的数据和输入要转化的进制
    JingZhiZhuanHuan(&S,data,m);        //转化作用,并且将转化的数据放入栈中
    DaYingShuJu(&S);                     //打印栈的数据
    return 0;
}
void  JingZhiZhuanHuan(SqStack  *S,int  data,int  m)    //转化数据函数
{
    int  b;
    while(data!=0)
    {
        b=data%m;
        data=data/m;
        *S->top=b;
        S->top++;
    }
}
void  DaYingShuJu(SqStack  *S)                         //打印数据函数
{

    do
    {
        S->top--;
        if(*S->top==10)
        {
            printf("A");
        }
        else if(*S->top==11)
        {
            printf("B");
        }
        else if(*S->top==12)
        {
            printf("C");
        }
        else if(*S->top==13)
        {
            printf("D");
        }
        else if(*S->top==14)
        {
            printf("E");
        }
        else if(*S->top==15)
        {
            printf("F");
        }
        else
        {
            printf("%d",*S->top);
        }

    }while(S->top!=S->base);
}

主函数:

要转换函数,将十进制数转换过程中数据放入栈中。

要打印函数,将栈中数据出栈,但是对于16进制要注意一下,举个例子:假如余数为13呢,你不能输出13吧,所以对于数据要判断一下;用一个循环完成。

总结:

主要用了栈这种数据结构的性质。来完成,我当时在想16进制时数据类型不一样(如有1或B),那么有数据不一样的栈吗?后来,想了一下,在打印函数时在判断中修改一下就行了?如果我那样想不就很麻烦吗?

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值